изменить массив после обещания. все в цикле foreach - PullRequest
0 голосов
/ 19 февраля 2019

У меня есть такой массив

 let result =  [{id:1,name:'test',dealValue:'ds',dealType:2},{id:2,name:'test1',dealValue:'ds',dealType:4}];

Я зацикливаю вышеуказанный массив для вызова другой функции, которая также является обещанием после каждой итерации. Мне нужно добавить значение в качестве нового элемента в текущем массиве..

let temp = [];

result.forEach((element, index) => {
    //build the promise    
    temp.push(getAmount(element.dealValue, element.dealType));
  });
  //execute array of promise
  let r = await Promise.all(temp);
  //add new key value pair
  result.forEach((element, index) => {
    element.IDGfee = r[index];
  });

Это прекрасно работает, однако я запускаю два цикла foreach для достижения желаемого результата, есть ли лучший способ сделать это ??

1 Ответ

0 голосов
/ 19 февраля 2019

Вместо этого можно использовать .map и назначить обратно element внутри .then, прикованного к вызову getAmount:

await Promise.all(
  result.map((element) => (
    getAmount(element.dealValue, element.dealType)
      .then((result) => {
         element.IDGfee = result;
      })
  ))
);

(хотя, как отмечается в комментариях, это не будетдождитесь возвращения каждого ответа, прежде чем присваивать каждому element - ваш текущий код будет выдан перед присваиванием, если какой-либо запрос выдает ошибку, тогда как он может бросить после того, как некоторые свойства были назначены.)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...