【问题标题】:Will the order of responses be the same as the order of the urls in my case?在我的情况下,响应的顺序是否与网址的顺序相同?
【发布时间】:2019-04-08 01:29:31
【问题描述】:

问题:

看完之后:

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

【问题讨论】:

    标签: javascript node.js api promise fetch


    【解决方案1】:

    TL;DR:是的。

    解释:

    Array.map返回一个promise数组,数组中每个promise的索引对应urls数组中URL的索引。

    Promise.all返回promises数组的resolves的结果数组,responses中每个结果的索引对应promises数组中对应promise的索引。

    【讨论】:

    • 谢谢。这就是我正在寻找的解释。
    【解决方案2】:

    是的,这是Promise.all 提供的保证之一。来自MDN's page on Promise.all

    返回值

    • ...
    • ...
    • 所有其他情况下的未决承诺。然后,当给定迭代中的所有承诺都已解决,或者任何承诺被拒绝时,这个返回的承诺将被异步解决/拒绝(只要堆栈为空)。请参阅下面有关“Promise.all 的异步性或同步性”的示例。 返回值将按照 Promises 传递的顺序排列,与完成顺序无关。

    (我的重点)

    (当然,the spec 也涵盖了,但是……规范很难阅读。)

    【讨论】:

      【解决方案3】:

      查看文档

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

      返回值将按照 Promise 传递的顺序,而不考虑完成顺序。

      所以答案是肯定的。此外,使用 setTimeout 设计测试并独立验证是否保持顺序也很简单。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-08
        • 2012-04-09
        • 2013-10-19
        相关资源
        最近更新 更多