【问题标题】:Run multiple Promise.all() in Sequence (Reading the second Promise.all only after the first one is completed)按顺序运行多个 Promise.all() (只有在第一个完成后才读取第二个 Promise.all)
【发布时间】:2021-05-25 02:23:12
【问题描述】:

我想按顺序运行多个 Promise.all 函数,其中第二个 Promise.all 仅在第一个 Promise.all 返回后才开始。我尝试使用 async/await 来执行此操作,但我注意到虽然第二个 Promise.all 的结果显示在第一个之后,但它实际上是在并行运行(这不是我想要的)。

在示例中,

const promise1 = Promise.resolve(3);
const promise2 = 42;
const promise3 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'FirstBatch');
});

const promise4 = Promise.resolve(3);
const promise5 = 42;
const promise6 = new Promise((resolve, reject) => {
  setTimeout(resolve, 2000, 'SecondBatch');
});

async function asyncCall() {
let values1 = await Promise.all([promise1, promise2, promise3]);
  console.log(values1);
  let values2 = await Promise.all([promise4, promise5, promise6]);
  console.log(values2);
}

asyncCall();

以上代码的输出为:
数组 [3, 42, "FirstBatch"]
数组 [3, 42, "SecondBatch"]

顺序是正确的,但问题是它们同时显示(这意味着“SecondBatch”在“Firstbatch”完成后没有等待 2 秒)。

如何让“SecondBatch”在“Firstbatch”完成后等待2秒?

【问题讨论】:

    标签: javascript node.js async-await promise


    【解决方案1】:

    您的 2 秒超时从您创建承诺 (*) 的那一刻开始执行。 Promise.all 不会“启动”promise,它只是确保它们在解决之前都已解决(或其中一个失败)。

    为了制作您想要的序列,您必须在收到values1 后创建promise6

    async function asyncCall() {
      const promise1 = Promise.resolve(3);
      const promise2 = 42;
      const promise3 = new Promise((resolve, reject) => {
        setTimeout(resolve, 2000, 'FirstBatch');
      });
      let values1 = await Promise.all([promise1, promise2, promise3]);
      console.log(values1);
    
      const promise4 = Promise.resolve(3);
      const promise5 = 42;
      const promise6 = new Promise((resolve, reject) => {
        setTimeout(resolve, 2000, 'SecondBatch');
      });
      let values2 = await Promise.all([promise4, promise5, promise6]);
      console.log(values2);
    }
    
    asyncCall();

    *) 更准确地说,超时是由提供给new Promise 的函数启动的,该函数在promise 创建期间同步执行

    【讨论】:

    • 谢谢。我对此有一个后续问题:假设我想打印名为“asyncCall() completed”的行 asyncCall(); console.log("AsyncCall 已完成");有没有办法让代码在打印“AsyncCall Completed”之前等待 asyncCall 完成;我知道我可以在 asyncCall() 函数本身的最后执行 'console.log("AsyncCall Completed")' (以确保它仅在其他所有内容完成后运行)但我想知道是否还有另一个也是。
    • 每个async 函数都会返回一个promise。因此,await asyncCall(); console.log("completed")asyncCall().then(() => console.log("completed")) 都可以工作。 (请注意,许多环境仍然不支持顶级 await,因此第一个 sn-p 可能需要包装在异步函数或 IIFE 中)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-01-04
    • 1970-01-01
    相关资源
    最近更新 更多