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(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中文网其他相关文章!