将promise变成promise.all

时间:2019-11-26 15:53:37

标签: javascript promise

有关ID的列表,我想进行一些GET。这些都包裹在一个诺言中。

let ids = [1, 2, 3]
let promises = [];
for (id in ids) {
    promises.push(ApiService.get(url + id))
}
return promises

现在在结果上调用promises.all时,结果按创建它们的顺序排列(1、2、3)。由于这是在某种API控制器中发生的,因此我宁愿不必返回“ ids”和promise。而是返回以下内容:

{1: PromiseofId1, 2: PromiseofId2, 3:PromiseofId3}

也许我的思维方式有缺陷,我愿意提出建议。

3 个答案:

答案 0 :(得分:1)

既然您知道订单,就可以在以后重新关联它们。

let ids = [1, 2, 3]
let promises = [];
for (id in ids) {
    promises.push(ApiService.get(url + id))
}
Promise.all(promises).then(results => {
    const data = {};
    results.forEach( (value, index) => { data[ ids[index] ] = value } );
    return data;
});

答案 1 :(得分:0)

您可以使用reduce来构建将每个ID映射到Promise对象中的对象。请参见此示例,该示例具有字符串而不是Promises,因此您可以通过运行代码段查看输出:

let ids = [1, 2, 3]
let promises = ids.reduce((acc, cur) => ({ ...acc, [cur]: `ApiService${cur}`}), {});

console.log(promises);

就您而言,您可以使用此功能:

let ids = [1, 2, 3]
let promises = ids.reduce((acc, cur) => ({ ...acc, [cur]: ApiService.get(url + id)}), {});

答案 2 :(得分:0)

您可能想要这样的东西。

async function getData(){
  const ids = [1, 2, 3]
  const promises = ids.map(id => ApiService.get(url + id))
  const responses = await Promise.all(promises)
  // Read whatever data from the response
  return responses.reduce((accumulator, response, index) => {
    accumulator[index + 1] = response.data
  }, {})
}

// Call it from an async function like this.
const dataMap = await getData()
// Returns {1:data1, 2:data2, ... }