Promise.allSettled 是否在所有情况下都保留响应中的原始顺序?

ske*_*tor 15 javascript es6-promise

当同时发出多个请求时Promise.allSettled,响应中的数组顺序是否与请求中的初始数组相对应?无论它们的结算顺序如何,它是否都保持相同的顺序?

const promise1 = new Promise((resolve, reject) => setTimeout(resolve, 2000, 1)); //finish last
const promise2 = Promise.resolve(2); //finish first
const promise3 = new Promise((resolve, reject) => setTimeout(resolve, 100, 3)); //finish in the middle

const promises = [promise1, promise2, promise3];

Promise.allSettled(promises).
  then((results) => results.forEach((result) => console.log(result)));
Run Code Online (Sandbox Code Playgroud)

在测试中这似乎是正确的,但文档中似乎无法保证该顺序将保留。MDN 文档在这里

Cer*_*nce 32

是的,这是有保证的。规范中描述了这些步骤。

在传递的可迭代对象的每次迭代中,它都会

将resolveElement.[[Index]] 设置为索引。将rejectElement.[[Index]] 设置为索引。

其中index是正在迭代的可迭代对象中的当前索引,然后将其传递给解析器或拒绝器算法。解析器和拒绝器最后都会:

将 value[index] 设置为 obj。

其中是整体将使用的values解析值数组。Promise.allSettled

传递的可迭代/数组中的第 n 项将始终对应于解析数组中的第 n 项。