正如前面的答案已经说过的,承诺。all用一个与原始promise的输入顺序相对应的数组聚合所有已解析的值(参见聚合promise)。
然而,我想指出的是,订单只保留在客户端!
对于开发人员来说,看起来承诺是按顺序实现的,但实际上,这些承诺是以不同的速度处理的。当您使用远程后端时,了解这一点很重要,因为后端可能以不同的顺序接收您的promise。
下面是一个通过使用超时来演示该问题的示例:
Promise.all
const myPromises = [
new Promise((resolve) => setTimeout(() => {resolve('A (slow)');console.log('A (slow)')}, 1000)),
新的承诺((resolve) => setTimeout(() => {resolve('B(更慢)');console.log('B(较慢)')},2000)),
new Promise((resolve) => setTimeout(() => {resolve('C (fast)');console.log('C (fast)')}, 10))
];
Promise.all (myPromises) (console.log)
在上面所示的代码中,三个promise (A, B, C)被给予Promise.all。三个承诺以不同的速度执行(C是最快的,B是最慢的)。这就是为什么promise的console.log语句以这样的顺序显示:
C (fast)
A (slow)
B (slower)
如果promise是AJAX调用,则远程后端将按此顺序接收这些值。但是在客户端承诺。all确保结果按照myPromises数组的原始位置排序。这就是为什么最终结果是:
['A (slow)', 'B (slower)', 'C (fast)']
如果您还想保证Promise的实际执行,那么您将需要一个类似Promise队列的概念。下面是一个使用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)']