У меня есть функция, которая принимает неизвестное количество идентификаторов зданий в массиве, т.е. [4,5], а затем вызывает функцию, которая возвращает его имя и описание. Я не знаю, как подойти к этому, учитывая, что это неизвестная сумма. Я попытался создать цикл for, но это ни к чему не привело, и я полностью потерян. Ниже вы видите, как я отправляю весь массив в функцию, но я хочу пройтись по каждому элементу и вызвать функцию отдельно

Изменить: Спасибо всем за добрые ответы. Вы были очень полезными и поддерживающими

function getBuilding(buildingId){
      return new Promise(function(resolve,reject){
          Building.getBuilding(buildingId).then((buildingInfo)=>{
              resolve(buildingInfo);
          }); 
      })
}
1
nodeboi 1 Май 2019 в 18:08

4 ответа

Лучший ответ

Вы хотите использовать Promise.all, обещание all разрешится, как только все элементы в массиве также будут разрешены. Затем он вернет обещание с массивом результатов, где первый элемент - это первый идентификатор идентификатора здания, второй - второй идентификатор и т. Д.

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
})
5
Get Off My Lawn 1 Май 2019 в 18:51

Я думаю, что оператор распространения и 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
});
2
William Lohan 1 Май 2019 в 15:14

Метод Promise.all () принимает массив обещаний и ожидает, пока они все не разрешатся.

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

Обратите внимание, что в случае сбоя одного из обещаний Promise.all () завершится неудачей.

3
GifCo 1 Май 2019 в 15:11

Вы можете использовать Promise.all, который принимает и iterable, который в этом случае может быть массивом.

Подобно:

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

}

Где обещания в основном массив аргументов, взгляните на:

2
Crisoforo Gaspar 1 Май 2019 в 15:12