有很多关于 async/await 在 javascript 映射函数中的行为的主题,但是,下面两个示例中的详细解释会很好:
const resultsPromises = myArray.map(async number => {
return await getResult(number);
});
const resultsPromises = myArray.map(number => {
return getResult(number);
});
编辑:这当然是一个虚构的案例,所以刚刚开始辩论,映射函数为什么、如何以及何时应该等待 await 关键字。解决方案如何修改这个例子,调用 Promise.all() 不是这个问题的目的。
getResult
是一个异步函数
原文由 user9274045 发布,翻译遵循 CC BY-SA 4.0 许可协议
其他答案已经很好地涵盖了您的示例行为的细节,但我想 尝试 更简洁地说明它。
Array.prototype.map
同步循环一个数组并将每个元素转换为其回调的返回值。这两个示例 都返回
Promise
。async
函数 总是 返回Promise
。getResult
返回一个Promise
。因此,如果没有错误,您可以在伪代码中将它们视为:
正如 zero298 所述 和 alnitak 所展示的那样,这非常快(同步地)按顺序开始每个承诺;然而,由于它们是并行运行的,每个 promise 都会按照他们认为合适的方式解决/拒绝,并且可能不会按顺序解决(履行或拒绝)。
要么并行运行承诺并使用
Promise.all
收集结果,要么使用 for * 循环 或Array.prototype.reduce
顺序运行它们。或者,您可以使用我维护 的可链式异步 JavaScript 方法 的第三方模块来清理并——也许——使代码符合你对 异步映射 操作可能如何工作的直觉: