如前面的答案所述,使用与原始 Promise 的输入顺序相对应的数组聚合所有已解析的值(请参见聚合 Promises)。Promise.all
但是,我想指出的是,订单仅在客户端保留!
对于开发人员来说,承诺似乎是按顺序实现的,但实际上,承诺以不同的速度处理。当您使用远程后端时,了解这一点非常重要,因为后端可能会以不同的顺序接收您的承诺。
下面是一个通过使用超时来演示该问题的示例:
承诺.所有
const myPromises = [
new Promise((resolve) => setTimeout(() => {resolve('A (slow)'); console.log('A (slow)')}, 1000)),
new Promise((resolve) => setTimeout(() => {resolve('B (slower)'); console.log('B (slower)')}, 2000)),
new Promise((resolve) => setTimeout(() => {resolve('C (fast)'); console.log('C (fast)')}, 10))
];
Promise.all(myPromises).then(console.log)
在上面显示的代码中,三个承诺(A,B,C)被赋予。三个承诺以不同的速度执行(C是最快的,B是最慢的)。這就是為什麼應許的陳述按以下順序顯示:Promise.all
console.log
C (fast)
A (slow)
B (slower)
如果 Promise 是 AJAX 调用,则远程后端将按此顺序接收这些值。但在客户端,确保根据数组的原始位置对结果进行排序。这就是为什么最终结果是:Promise.all
myPromises
['A (slow)', 'B (slower)', 'C (fast)']
如果你想保证你的承诺的实际执行,那么你需要一个像承诺队列这样的概念。下面是一个使用 p-queue 的示例(请注意,您需要将所有 Promise 包装在函数中):
顺序承诺队列
const PQueue = require('p-queue');
const queue = new PQueue({concurrency: 1});
// Thunked Promises:
const myPromises = [
() => new Promise((resolve) => setTimeout(() => {
resolve('A (slow)');
console.log('A (slow)');
}, 1000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('B (slower)');
console.log('B (slower)');
}, 2000)),
() => new Promise((resolve) => setTimeout(() => {
resolve('C (fast)');
console.log('C (fast)');
}, 10))
];
queue.addAll(myPromises).then(console.log);
结果
A (slow)
B (slower)
C (fast)
['A (slow)', 'B (slower)', 'C (fast)']