运行 多个函数彼此异步,但与整个程序同步

Running multiple functions asynchronously in relation to each other but synchronously in relation to program as a whole

基本上,我在异步函数中有一个 try 块,基本上如下所示:

async function functionName() {
  try {
    await function1() // each of function 1, 2, and 3 are async functions
    await function2()
    await function3()
    //some more awaits below this point
  } catch(err) {
    console.log(err)
  }
}

本质上,我想 运行 function1、function2 和 function3 相对于彼此异步(也就是同时拥有它们三个 运行),但我会喜欢在继续程序之前等待所有这些都完成(因此与函数的其余部分同步设置 3 运行)。出于各种原因,我不能只将 function2 和 function3 中的代码放在 function1 中,所以不幸的是,这不是一个选项。非常感谢任何帮助!

假设你的所有函数 return 承诺 resolve/reject 当异步操作完成时,那么你可以使用 Promise.all() 让它们同时运行并且全部完成后收到通知:

async function functionName() {
  try {
    let results = await Promise.all([function1(), function2(), function3()]);       //some more awaits below this point
  } catch(err) {
    console.log(err)
  }
}

或者,如果你不希望出现错误时短路,你可以使用 Promise.allSettled() 代替,它只会在所有请求完成时通知你,无论它们是否有一个错误。

请记住,您的函数中只有真正的非阻塞异步操作才会真正 运行 并行。您的函数中的任何阻塞、同步代码仍然一次只能 运行 一个。而且,请记住,仅仅因为一个函数被标记为 async 并不会异步地做任何事情 运行 。 async 关键字的全部作用是允许您在函数内部使用 await 并使函数自动成为 return 承诺。它不会在函数 运行 中异步生成任何内容。

如果您展示的是真实代码而不是伪代码,我们可以更具体地评论您在做什么以及编写代码的最佳方式。请抵制仅使用伪代码 post 问题的诱惑。当我们看到您的真实代码时,我们总是可以提供更好的帮助。


此外,此 运行 中的 none 与整个程序同步。它将在函数体内同步出现 运行(因为函数执行将被 await 暂停)。但是,一旦函数达到 await,它立即 return 未解决的承诺并在此函数调用继续后执行。 运行 使整个程序同步的唯一方法是使用同步编码,而不是非阻塞的异步编码。