Looking at MDN it looks like the values
passed to the then()
callback of Promise.all contains the values in the order of the promises. For example:
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?
});
Can anybody quote a spec stating in which order values
should be in?
PS: Running code like that showed that this seems to be true although that is of course no proof - it could have been coincidence.
Shortly, the order is preserved.
Following the spec you linked to, Promise.all(iterable)
takes an iterable
as a parameter and internally calls PerformPromiseAll(iterator, constructor, resultCapability)
with it, where the latter loops over iterable
using IteratorStep(iterator)
.
Resolving is implemented via Promise.all() Resolve
where each resolved promise has an internal [[Index]]
slot, which marks the index of the promise in the original input.
All this means the output is strictly ordered given the iterable you pass to Promise.all() is strictly ordered (for example, an array).
You can see this in action in the below fiddle (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));
});