运行 多个函数彼此异步,但与整个程序同步
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 未解决的承诺并在此函数调用继续后执行。 运行 使整个程序同步的唯一方法是使用同步编码,而不是非阻塞的异步编码。
基本上,我在异步函数中有一个 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 未解决的承诺并在此函数调用继续后执行。 运行 使整个程序同步的唯一方法是使用同步编码,而不是非阻塞的异步编码。