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



当与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)));

在测试中,这似乎是真的,但文档中似乎不能保证订单会保留下来。MDN文档在这里

是的,它是有保证的。说明书中描述了这些步骤。

在传递的可迭代项上的每次迭代中,它都会执行

设置resolveElement。[[Index]]进行索引。设置rejectElement。[[Index]]进行索引。

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

将值[index]设置为obj.

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

传递的iterable/array中的第n个项将始终对应于已解析数组中的第N个项。

最新更新