Promise.allSettled 是否在所有情况下都保留响应中的原始顺序?
Does Promise.allSettled preserve the original order in the response in all scenarios?
当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 文档是 here
是的,有保证。 the specification.
中描述了这些步骤
在传递的可迭代对象的每次迭代中,它确实
Set resolveElement.[[Index]] to index.
Set rejectElement.[[Index]] to index.
其中 index
是正在迭代的 iterable 中的当前索引,然后将其传递给解析器或拒绝器算法。解析器和拒绝器都在最后:
Set values[index] to obj.
其中 values
是整个 Promise.allSettled
将解析的解析值数组。
传递的第 n 项 iterable/array 将始终对应于解析数组中的第 n 项。
当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 文档是 here
是的,有保证。 the specification.
中描述了这些步骤在传递的可迭代对象的每次迭代中,它确实
Set resolveElement.[[Index]] to index. Set rejectElement.[[Index]] to index.
其中 index
是正在迭代的 iterable 中的当前索引,然后将其传递给解析器或拒绝器算法。解析器和拒绝器都在最后:
Set values[index] to obj.
其中 values
是整个 Promise.allSettled
将解析的解析值数组。
传递的第 n 项 iterable/array 将始终对应于解析数组中的第 n 项。