Promise.all:保留解析值的顺序
Promise.all() 方法接受一个 iterable 作为其参数并返回一个新的一旦 iterable 中的所有承诺都解决了,承诺就会解决。问题出现了:解析值的顺序是否保证与可迭代中 Promise 的顺序匹配?
根据 MDN 文档,解析值应该按照 Promise 的顺序出现。然而,对这种特定行为的直接引用在规范中并没有立即显现出来。
深入研究规范,我们发现 PerformPromiseAll() 是通过传递给 Promise.all() 的可迭代对象来调用的。 PerformPromiseAll() 然后使用 IteratorStep() 迭代可迭代对象,这保证了 Promise 的顺序。
此外,每个已解析的 Promise 都有一个内部 [[Index]] 槽,表示其在原始输入可迭代对象中的索引。该槽在解析过程中使用,以确保输出数组保持原始顺序。
综上所述,只要输入,Promise.all() 中解析值的顺序就会被严格保留iterable 是有序的。以下代码片段对此进行了示例:
<code class="js">const slow = new Promise(resolve => setTimeout(resolve, 200, 'slow')); const instant = 'instant'; const quick = new Promise(resolve => setTimeout(resolve, 50, 'quick')); Promise.all([slow, instant, quick]).then(responses => { responses.map(response => console.log(response)); }); // Output: [ 'instant', 'quick', 'slow' ]</code>
以上是`Promise.all()` 是否保留解析值的顺序?的详细内容。更多信息请关注PHP中文网其他相关文章!