首页  >  文章  >  web前端  >  `Promise.all()` 是否保证解析值的顺序?

`Promise.all()` 是否保证解析值的顺序?

Mary-Kate Olsen
Mary-Kate Olsen原创
2024-11-03 05:40:02874浏览

Does `Promise.all()` Guarantee the Order of Resolved Values?

Promise.all:解析值的顺序

Promise.all() 方法支持并发执行和解析多个 Promise,为开发人员提供了强大的异步编程工具。关于 Promise.all() 结果数组中解析值的顺序,出现了一个有趣的问题。

根据 Mozilla 开发者网络 (MDN),从 Promise 的 .then() 回调获得的结果。 all() 似乎按照与输入 Promise 相同的顺序排序。例如:

var somePromises = [1, 2, 3, 4, 5].map(Promise.resolve);
return Promise.all(somePromises).then(function(results) {
  console.log(results) //  is [1, 2, 3, 4, 5] the guaranteed result?
});

Promises 规范保证这种行为吗?让我们深入研究技术细节来找出答案。

在 Promise.all() 中保留顺序

在 Promise.all(iterable) 方法中,iterable 表示 Promise 的集合。 PerformPromiseAll(iterator, constructor, resultCapability) 函数在内部调用,使用 IteratorStep(iterator) 迭代可迭代对象。

当 Promise 以解析值结算时,将调用 Promise.all() Resolve。每个已解决的 Promise 都带有一个内部 [[Index]] 槽,表示其在原始可迭代中的位置。

因此,Promise.all() 的输出保持严格的顺序,与中 Promise 的顺序相对应。输入可迭代。只要提供的可迭代对象是严格有序的,例如数组,这一点就成立。

顺序保存演示

下面是一个实际示例,说明了 Promise.all() 中的顺序保存:

<code class="javascript">// Used to display results
const write = msg => {
  document.body.appendChild(document.createElement('div')).innerHTML = msg;
};

// Different speed async operations
const slow = new Promise(resolve => {
  setTimeout(resolve, 200, 'slow');
});
const instant = 'instant';
const quick = new Promise(resolve => {
  setTimeout(resolve, 50, 'quick');
});

// The order is preserved regardless of what resolved first
Promise.all([slow, instant, quick]).then(responses => {
  responses.map(response => write(response));
});</code>

在这种情况下,“instant”值会立即解析,然后是“quick”和 '慢的'。但是,根据 Promise.all() 中的顺序保留,结果将按以下顺序显示:“慢”、“即时”、“快”,与输入数组中 Promise 的顺序对齐。

以上是`Promise.all()` 是否保证解析值的顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn