我正在尝试处理由对象组成的数组。每个对象都有一个字段,其值是数字数组。我想以异步/等待方式处理所有数字数组的所有组件。
数据示例如下:
const data = [{
numbers: [1, 2, 3],
}, {
numbers: [4, 5, 6],
}, {
numbers: [7, 8, 9],
}];
我通过两种方式实现了这个功能。第一个代码是这样的:
const processData1 = async(data) => {
return Promise.all(data.map(async(d) => {
const partial = await Promise.all(d.numbers.map(async(n) => {
console.log('INIT', n);
const number = await processNumber(n);
console.log('END', n);
return number;
}));
return partial;
}));
};
第二个是这样的:
const processData2 = async(data) => {
for (const d of data) {
for (let n of d.numbers) {
console.log('INIT', n);
n = await processNumber(n);
console.log('END', n);
}
}
};
我希望在所有情况下在控制台中看到的都是按正确顺序依次打印的“INIT”和“END”。在第二个代码函数中也是如此。但在第一个中,我看到与数字一样多的 INIT,然后是所有相应的 END:
**** processData1 ****
INIT 1
INIT 2
INIT 3
INIT 4
INIT 5
INIT 6
INIT 7
INIT 8
INIT 9
END 1
END 2
END 3
END 4
END 5
END 6
END 7
END 8
END 9
**** processData2 ****
INIT 1
END 1
INIT 2
END 2
INIT 3
END 3
INIT 4
END 4
INIT 5
END 5
INIT 6
END 6
INIT 7
END 7
INIT 8
END 8
INIT 9
END 9
这怎么可能?为什么await processNumber
等待所有数字被解析?
最佳答案
在第一个示例中,您只需等待 Promise.all
的结果,这意味着每个 Promise 都会同时执行。在第二个示例中,您等待每个单独的 promise ,这迫使它们连续执行。
两种方案都有其用途,如果您不关心顺序,即操作可以同时运行,第一种方案更好,第二种方案对于强制异步代码按顺序执行非常有用。
关于javascript - NodeJS Promise.all 正在等待所有组件完成后再继续,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51437452/