【问题标题】:Calling async functions from within synchronous loops & keeping the results ordered从同步循环中调用异步函数并保持结果有序
【发布时间】:2020-06-27 13:05:21
【问题描述】:
async function processArray(array) {
let myOrderedArray = [];
for (const item of array) {
const value = await getValue(item);
myOrderedArray.push(value);
}
return myOrderedArray;
}
我想遍历数组,为每个项目执行一个异步操作,然后将我得到的值保存在不同的数组中。这个结果数组是有序的:我希望item1 的结果值出现在结果中的位置1,在item2 之前,依此类推。
但是,这些是异步调用。我不能确定我的异步函数调用是否以完全相同的顺序返回,因为它们不是同步的。我怎样才能实现这样的目标?
【问题讨论】:
标签:
javascript
node.js
loops
asynchronous
async-await
【解决方案1】:
async function processArray(array) {
return array.map(async item => {
return await getValue(item);
})
}
promise 中的promise 是有序的
【解决方案2】:
您的代码已经保证它们会井井有条,但是这样做的速度很慢。您的代码将运行直到第一次等待,然后阻塞直到它获得值。只有当它有第一个值时才会循环,然后再次阻塞第二个值。
如果您想并行执行它们,那么您需要创建一个 promise 数组,并使用 Promise.all 等待它们全部完成。
async function processArray(array) {
const promises = array.map(item => getValue(item));
const myOrderedArray = await Promise.all(promises);
return myOrderedArray;
}
如果您没有对进程数组中的 myOrderedArray 做任何事情,那么您可以将其简化为:
function processArray(array) {
const promises = array.map(item => getValue(item));
return Promise.all(promises);
}
【解决方案3】:
由于您正在等待getValue 函数,因此尽管是异步调用,但仍将保持顺序。直到第一次调用成功时才会调用 push 函数。 for...of 循环尊重异步承诺代码。