在我的例子中,响应的顺序与网址的顺序相同吗?

问题描述 投票:0回答:3

问题:

看完这个:

Promise.all:解析值的顺序

我不确定它是否适用于我的情况。

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 promise fetch-api
3个回答
2
投票

TL;博士:是的。

说明:

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

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


2
投票

是的,这是

Promise.all
提供的保证之一。来自 MDN 的
Promise.all
页面:

返回值

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

(我的重点)

(当然也包含在规范中,但是......规范很难阅读。)


1
投票

查看文档

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

返回值将按照传递的 Promise 的顺序排列,无论完成顺序如何。

所以答案是肯定的。此外,使用 setTimeout 设计一个测试并独立验证顺序是否得到维护也很简单。

© www.soinside.com 2019 - 2024. All rights reserved.