【问题标题】:How to wait for Promise.all() to complete before reaching next line?如何在到达下一行之前等待 Promise.all() 完成?
【发布时间】:2022-09-25 15:58:44
【问题描述】:

我正在学习 Node.js。

我必须在Promise.all() 循环中调用异步函数work(),并且必须在继续执行Promise.all() 之后的语句之前完成它。 目前,它在完成work() 之前达到FINISH 状态。

让代码等待 work() 函数完成的正确方法是什么?

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

async function work() {
    await new Promise((resolve, reject) => {
        setTimeout(resolve, 2000, \'foo\');
    })
    console.log(\'some work here\')
}

async function main() {
    await Promise.all([promise1, promise2, promise3]).then((values) => {
        values.forEach(function(item) {
            console.log(item)
            work()
        });
    });
    console.log(\'FINISH\')
}

main()
  • 为什么用已经解析的Promises 数组调用Promise.all()?这没有多大意义...
  • 您的所有 3 个承诺都已解决。不要混搭awaitthen...
  • 您需要从work() 返回承诺并在then() 中调用以下功能 - 与promiseN 完全相同。话虽如此,promiseN 似乎完全多余,因为您在致电Promise.all() 之前已经解决了它们...?我认为这只是一个人为的演示示例?
  • 最初的 [promise1, promise2, promise3] 承诺块只是为了说明,我正在那里下载一些文件,目标是在下载完所有文件后对这些文件进行一些操作。
  • \"只是为了说明......对那些文件做一些操作\"- 然后在问题中写下,因为现在您的示例没有做任何有用的事情(Promise.all() 和忽略items 的work() 调用都没有,因此您的脚本与work(); work(); work(); 的作用相同做)

标签: javascript node.js async-await promise


【解决方案1】:

很难说你真正想要的是什么,但一般来说,不要混搭awaitthen

const promise1 = Promise.resolve(1);
const promise2 = Promise.resolve(2);
const promise3 = Promise.resolve(3);

function delay(ms) {
  return new Promise((resolve) => setTimeout(resolve, ms));
}

async function work(value) {
  await delay(1000 * value);
  console.log("some work here", value);
  await delay(1000);
  return value * 2;
}

async function main() {
  // Doesn't really do much, since these are already resolved...
  const values = await Promise.all([promise1, promise2, promise3]);
  // Pass all of those values to `work`, which returns a promise,
  // and wait for all of those promises to resolve.
  const workedValues = await Promise.all(values.map(work));
  console.log(workedValues);
}

main();

打印出来(第一行有各种延迟)

some work here 1
some work here 2
some work here 3
[ 2, 4, 6 ]

【讨论】:

  • 谢谢你。这有帮助。我现在明白我必须使用另一个 Promise.all() 来完成 work() 。
【解决方案2】:

我认为您在调用 work() 函数之前忘记了 await

【讨论】:

  • 这没有用。
  • 通过提供解决方案示例及其对 OP 的帮助,可以改进您的答案。
猜你喜欢
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2020-10-30
  • 1970-01-01
  • 2018-05-20
  • 1970-01-01
  • 2021-01-03
  • 2021-07-30
相关资源
最近更新 更多