wait Promise.all() 和多个await 之间有什么区别?

2023-12-10

之间有什么区别:

const [result1, result2] = await Promise.all([task1(), task2()]);

and

const t1 = task1();
const t2 = task2();

const result1 = await t1;
const result2 = await t2;

and

const [t1, t2] = [task1(), task2()];
const [result1, result2] = [await t1, await t2];

Note:这个答案只是涵盖了之间的时间差异await系列中和Promise.all。请务必阅读@mikep 的全面答案,还涵盖了错误处理中更重要的差异.


为了这个答案的目的,我将使用一些示例方法:

  • res(ms)是一个函数,它需要整数毫秒并返回一个在这么多毫秒后解析的承诺。
  • rej(ms)是一个函数,它需要整数毫秒并返回一个在这么多毫秒后拒绝的承诺。

Calling res启动计时器。使用Promise.all等待一些延迟将在所有延迟完成后解决,但请记住它们同时执行:

Example #1

const data = await Promise.all([res(3000), res(2000), res(1000)])
//                              ^^^^^^^^^  ^^^^^^^^^  ^^^^^^^^^
//                               delay 1    delay 2    delay 3
//
// ms ------1---------2---------3
// =============================O delay 1
// ===================O           delay 2
// =========O                     delay 3
//
// =============================O Promise.all
async function example() {
  const start = Date.now()
  let i = 0
  function res(n) {
    const id = ++i
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve()
        console.log(`res #${id} called after ${n} milliseconds`, Date.now() - start)
      }, n)
    })
  }

  const data = await Promise.all([res(3000), res(2000), res(1000)])
  console.log(`Promise.all finished`, Date.now() - start)
}

example()

这意味着Promise.all3 秒后将使用内部 Promise 的数据进行解析。

But, Promise.all具有“快速失败”行为:

Example #2

const data = await Promise.all([res(3000), res(2000), rej(1000)])
//                              ^^^^^^^^^  ^^^^^^^^^  ^^^^^^^^^
//                               delay 1    delay 2    delay 3
//
// ms ------1---------2---------3
// =============================O delay 1
// ===================O           delay 2
// =========X                     delay 3
//
// =========X                     Promise.all
async function example() {
  const start = Date.now()
  let i = 0
  function res(n) {
    const id = ++i
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve()
        console.log(`res #${id} called after ${n} milliseconds`, Date.now() - start)
      }, n)
    })
  }
  
  function rej(n) {
    const id = ++i
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        reject()
        console.log(`rej #${id} called after ${n} milliseconds`, Date.now() - start)
      }, n)
    })
  }
  
  try {
    const data = await Promise.all([res(3000), res(2000), rej(1000)])
  } catch (error) {
    console.log(`Promise.all finished`, Date.now() - start)
  }
}

example()

如果你使用async-await相反,您必须等待每个承诺依次解决,这可能效率不高:

Example #3

const delay1 = res(3000)
const delay2 = res(2000)
const delay3 = rej(1000)

const data1 = await delay1
const data2 = await delay2
const data3 = await delay3

// ms ------1---------2---------3
// =============================O delay 1
// ===================O           delay 2
// =========X                     delay 3
//
// =============================X await
async function example() {
  const start = Date.now()
  let i = 0
  function res(n) {
    const id = ++i
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        resolve()
        console.log(`res #${id} called after ${n} milliseconds`, Date.now() - start)
      }, n)
    })
  }
  
  function rej(n) {
    const id = ++i
    return new Promise((resolve, reject) => {
      setTimeout(() => {
        reject()
        console.log(`rej #${id} called after ${n} milliseconds`, Date.now() - start)
      }, n)
    })
  }
  
  try {
    const delay1 = res(3000)
    const delay2 = res(2000)
    const delay3 = rej(1000)

    const data1 = await delay1
    const data2 = await delay2
    const data3 = await delay3
  } catch (error) {
    console.log(`await finished`, Date.now() - start)
  }
}

example()
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

wait Promise.all() 和多个await 之间有什么区别? 的相关文章

随机推荐

  • 在 SQL Server 中如何透视多列

    这是我的示例表 我想旋转类别列并将销售额 库存和目标作为行 我想要这种形式的示例输出 如下所示 其中类别代替列 列代替行 您必须更改下一个数据透视表的列名称 Like SELECT FROM SELECT Branch Category C
  • 当父视图具有日期选择器、SwiftUI 时,不会调用 onPreferenceChange

    我有一个父视图 它有两个子视图 当子视图更改首选项值时 父视图通过以下方式接收首选项更改onPreferenceChange但是 当父级有日期选择器时 onPreferenceChange没有接到电话并停止工作 有没有人找到任何解决方法 s
  • 使用函数解析函数参数的正则表达式

    我想获取字符串的函数参数 sample 5 5 euros 这适用于 s 演示在这里 问题是当我将另一个函数放入参数中时 sample decimal 5 5 euros 仅适用于以下功能 s 演示在这里 但是对于两个或更多函数 我无法获取
  • 将新绘图添加到现有图形中

    我有一个带有一些图的脚本 请参阅示例代码 在做了一些其他事情之后 我想在现有的绘图中添加一个新的绘图 但是当我尝试它时 它会添加最后创建的图形 现在的图2 的绘图 我不知道如何改变它 import matplotlib pylab as p
  • 如何更改导航栏高度

    我看到了一个改变导航栏高度的解决方案 但对我来说没有任何作用 现在我的应用程序有一个与导航控制器连接的视图控制器 我还没有在我的项目中实现任何其他代码 在开始我的项目之前 我需要更改导航栏的高度 edited h CGSize sizeTh
  • 如何定义带有闭包的相互递归?

    我可以做这样的事情 fn func gt Vec
  • 如何解决“项目已添加。键入字典:”错误?

    我有一个应用程序 当我尝试向其中添加项目时 该应用程序被挂起 当我检查跟踪文件时 我得到了这个条目 for int i 0 i
  • 如何保留 svg 文本中的空格

    要在 svg 的文本元素中保留空格 应使用 xml space preserve 作为文本的属性 jsfiddle 但是 它不起作用 我究竟做错了什么 init snap var svgElement document getElement
  • Spring Boot Rest 中没有内容

    当方法未获取记录时 如何配置 Spring Boot 在 GET 方法 通常是 findAll 方法 中返回 204 我不想在每个方法中都做处理 输入下面的代码 if result return new ResponseEntity
  • 使用 django cms cmsplugin_filer_file 和 cmsplugin_filer_image 进行未定义上传

    我刚刚开始使用 django cms 所以请原谅我的新手 每次我尝试在管理区域上传文件时 例如 图像文件使用cmsplugin filer file cmsplugin filer image它 在剪贴板区域中显示为未定义 这很奇怪 因为
  • WifiManager.calculateSignalLevel(RSSI, 5) 问题

    我正在尝试使用 Wifimanager 来计算扫描期间找到的接入点的信号级别 我正在使用以下方法 WifiManager calculateSignalLevel int int 但无论 RSSI 级别是多少 它似乎总是返回相同的 int
  • 使用循环中的复杂命令在 gnome 终端中打开多个选项卡

    我有一个需要这样调用的命令 command complex argument 如果我想运行 gnome terminal 并传递这个参数 它会像这样 gnome terminal e command complex argument 我想在
  • XCode 7 UI 测试:关闭系统生成的 UIAlertController 不起作用

    我有一个 UI 测试 其中涉及取消系统生成的UIAlertController 此警报要求用户授予访问设备日历的权限 测试的目标是点击后的行为OK button 1 let app XCUIApplication this code was
  • 如何判断一个点是否在二维凸多边形内部?

    我有一个凸多边形 通常只是一个旋转的正方形 并且我知道所有 4 个点 如何确定给定点 黄色 绿色 是否为inside多边形 编辑 对于这个特定的项目 我无法访问 JDK 的所有库 例如 AWT 这一页 http www ecse rpi e
  • 无法在 junit 中模拟 BufferedWriter 类

    我在源代码中使用 BufferedWriter 对象 BufferedWriter outputToErrorFile new BufferedWriter new FileWriter file outputToErrorFile app
  • 如何找到像素级标准差?

    我有 20 个具有相同分辨率和范围的栅格 这是一个时间序列 每个栅格都是一年 我想计算所有栅格的像素标准偏差 到目前为止 我正在使用 raster 包 qq2 lt list maxras1 maxras2 maxras3 maxras4
  • 合并两个对象数组的最有效方法

    我已经解决了这个问题 不过 我正在寻找更快的解决方案 因为我的变量有数千个对象 我有两个这样的数组 var full a aa1 b bb1 a aa3 b bb2 a aa3 b bb3 a aa2 b bb3 some a aa1 b
  • 错误6(net::ERR_FILE_NOT_FOUND):找不到文件c或目录

    我正在使用 scriptcase php 代码生成器 它安装在服务器中 但我通过网络访问它 一切都很好 直到有人注销了服务器的管理员 这是我使用的用户 我重新启动了服务器并以管理员身份登录 但现在我无法从 chrome 访问 scriptc
  • 将执行计时代码放入函数中,OpenCV?

    我在我的程序 C 和 OpenCV 中随处使用了这个代码片段 它用于计时一些操作 double t Some code t double getTickCount Object1 LotOfComputing t 1000 double g
  • wait Promise.all() 和多个await 之间有什么区别?

    之间有什么区别 const result1 result2 await Promise all task1 task2 and const t1 task1 const t2 task2 const result1 await t1 con