承诺:如何兑现未知数量的承诺

时间:2019-05-01 15:08:09

标签: javascript promise

我有一个函数,该函数在数组中即[4,5]中接收未知数量的建筑物ID,然后调用一个返回其名称和描述的函数。鉴于数量未知,我不知道该如何处理。我尝试创建一个for循环,但无济于事,我完全迷路了。您在下面看到的是我将整个数组发送给函数,但是我想遍历每个元素并分别调用函数

编辑:谢谢大家的友好答复。您一直非常乐于助人和支持

function getBuilding(buildingId){
      return new Promise(function(resolve,reject){
          Building.getBuilding(buildingId).then((buildingInfo)=>{
              resolve(buildingInfo);
          }); 
      })
}

4 个答案:

答案 0 :(得分:4)

您要使用Promise.allall的承诺将在数组中的所有项目也都解决之后就解决。然后,这将返回带有结果数组的promise,其中第一项是第一个建筑物ID结果,第二个是第二个建筑物ID,依此类推。

function getBuilding(ids) {
  let promises = []
  // We will assume `getInfo()` returns a promise that resolves the buildings info
  ids.forEach(id => promises.push(getInfo(id)))
  return Promise.all(promises)
}

function getInfo(id) {
  // Resolves the info after a random amount of time to simulate
  // something that may take some time to execute.
  return new Promise(resolve => setTimeout(() => resolve({id}), Math.floor(Math.random() * 5000)))
}

console.log('Just a moment, calculating data...')
getBuilding([3, 5, 7, 9]).then(results => {
  console.log('building id', results[0].id) // buildingId = 3
  console.log('building id', results[1].id) // buildingId = 5
  console.log('building id', results[2].id) // buildingId = 7
  console.log('building id', results[3].id) // buildingId = 9
})

答案 1 :(得分:3)

Promise.all()方法接受一个承诺数组,并等待它们全部解决。

Promise.all([promise1, promise2, promise3]).then(function(values) {
  console.log(values);
});

请注意,如果任何一项承诺失败,Promise.all()都会失败。

答案 2 :(得分:2)

您可以使用Promise.alliterable(在这种情况下可以是数组)使用。

赞:

function caller( ...promises ) {
    Promise.all( promises ).then( function( value ) {
      console.log( 'all completed' );
    });

}

promise基本上是一组参数,请看:

答案 3 :(得分:2)

我认为传播算子和Promise.all

function getInfos(...ids) {
  return Promise.all(ids.map(id => Building.getBuilding(id )));
}

//      can be any number of params
getInfos(id1, id2, id3).then(([info1, info2, info3]) => {
  // do stuff
});

在另一种评论中,我看到buildingId是数组,

const buildingId = [1, 2, 3];
getInfos(...buildingId).then(([info1, info2, info3]) => {
  // do stuff
});

或简化的

function getInfos(ids) {
  return Promise.all(ids.map(id => Building.getBuilding(id )));
}

const buildingId = [1, 2, 3];
getInfos(buildingId).then(([info1, info2, info3]) => {
  // do stuff
});