问题:
查看此内容后:
Promise.all: Order of resolved values
我不确定这是否适用于我的情况。 responses
是否总是与urls
相同?
代码:
var urls = [];
for (var i = 0; i < enemies.length; i++) {
urls.push('someURL/'+enemies[i].id);
}
let promises = urls.map(url => fetchJSON(url, region));
Promise.all(promises).then(responses => {
//DO SOMETHING HERE WITH RESPONSES WHERE ORDER IS IMPORTANT
});
function fetchJSON(url, region) {
return fetch(url, {
region: region,
headers: {
'token': apiKey
}
}).then(response => response.json());
}
答案 0 :(得分:2)
是的,这是Promise.all
提供的保证之一。来自MDN's page on Promise.all
:
返回值
- ...
- ...
- 在所有其他情况下的未决承诺。当给定可迭代对象中的所有promise已解决,或者任何promise均被拒绝时,此返回的promise随后将被异步解析/拒绝(堆栈为空时)。请参阅下面的有关“ Promise.all的异步性或同步性”的示例。 无论完成顺序如何,返回值都将按照传递的承诺的顺序进行。
(我的重点)
(当然也被the spec涵盖,但是...该规范很难阅读。)
答案 1 :(得分:2)
TL; DR:是的。
说明:
Array.map
返回一个Promise数组,该数组中每个Promise的索引对应于urls
数组中URL的索引。
Promise.all
返回resolve
数组的promises
s个结果的数组,responses
中每个结果的索引对应于相应promise的索引在promises
数组中。
答案 2 :(得分:1)
检查文档
无论完成顺序如何,返回值都将按照传递的承诺的顺序进行。
所以答案是肯定的。此外,使用setTimeout进行测试并独立地验证顺序是否维护也很简单。