在我的情况下,响应顺序是否与网址的顺序相同?

时间:2018-11-04 14:06:54

标签: javascript node.js api promise fetch

问题:

查看此内容后:

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

3 个答案:

答案 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)

检查文档

https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/all#Return_value

  

无论完成顺序如何,返回值都将按照传递的承诺的顺序进行。

所以答案是肯定的。此外,使用setTimeout进行测试并独立地验证顺序是否维护也很简单。