Promise.all:parsing值的顺序

查看MDN,它看起来像传递给Promise.all then()callback函数的值。所有的值都按照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? }); 

任何人都可以引用一个规范,说明应该在哪个顺序values

PS:像这样运行的代码表明,这似乎是真的,虽然这当然没有证据 – 这可能是巧合。

不久, 订单被保留

遵循你链接的规范, Promise.all(iterable)将一个iterable (即支持Iterator接口的对象)作为参数,随后调用PerformPromiseAll( iterator, constructor, resultCapability) ,后者循环通过使用IteratorStep(iterator)
这意味着,如果你传递给Promise.all()的迭代是严格sorting的,那么它们在传入后仍然会被sorting。

parsing通过Promise.all() Resolve来实现, Promise.all() Resolve每个已parsing的promise都有一个内部的[[Index]]槽,它在原始input中标记了promise的索引。


所有这一切意味着只要input是严格sorting的(例如数组),输出就严格按照inputsorting。

你可以在下面的小提琴中看到这个(ES6):

 // 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)); }); 

是的, results中的值与promises顺序相同。

有人可能会引用Promise.all的ES6规范。尽pipe由于使用了迭代器api和通用promise构造函数,这有点令人费解。 但是,您会注意到每个parsing器callback函数都有一个[[index]]属性,它是在promise数组迭代中创build的,用于设置结果数组的值。