问题:
看完这个:
我不确定它是否适用于我的情况。
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());
}
TL;博士:是的。
说明:
Array.map
返回一个 Promise 数组,数组中每个 Promise 的索引对应于 urls
数组中 URL 的索引。
Promise.all
返回resolve
数组中promises
的结果数组,responses
中每个结果的索引对应于promises
数组中相应promise的索引。
是的,这是
Promise.all
提供的保证之一。来自 MDN 的 Promise.all
页面:
返回值
- ...
- ...
- 所有其他情况下的待定 Promise。当给定可迭代对象中的所有 Promise 都已解析,或者任何 Promise 被拒绝时,返回的 Promise 将被异步解析/拒绝(只要堆栈为空)。请参阅下面有关“Promise.all 的异步性或同步性”的示例。 返回值将按照传递的 Promise 的顺序排列,无论完成顺序如何。
(我的重点)
(当然也包含在规范中,但是......规范很难阅读。)
查看文档
返回值将按照传递的 Promise 的顺序排列,无论完成顺序如何。
所以答案是肯定的。此外,使用 setTimeout 设计一个测试并独立验证顺序是否得到维护也很简单。