Как дождаться асинхронной функции ?(javascript)

Есть код:

arr = [7, 2, 8, 4, 3];
arr2 = [];
arr.forEach(async function(item, i) {
  var z = await func(item);
  // операции над z
  arr2.push(z);
});

arr2.forEach(function(item, i) {
  console.log(item);
});

Проблема в том, что 2й цикл с arr2 начинает работу до того, как закончит первый цикл, а arr2.push(z) до того, как z получит результат.

Как исправить ?


Ответы (2 шт):

Автор решения: mrEvgenX

Если хочется параллельно запустить несколько асинхронных функций и дождаться их результата, то лучше использовать Promise.all и arr.map. forEach здесь никак не подходит.

Пример кода, Который демонстрирует эту идею:

arr = [7, 2, 8, 4, 3];
Promise.all(arr.map(async function(item, i) {
  var z = await func(item);
  // операции над z
  return z;
})).then(arr2 => {
  arr2.forEach(function(item, i) {
    console.log(item);
  });
})
→ Ссылка
Автор решения: DiD

И откуда эта мода на forEach(). Правильно будет вот так.

( async () => {
  const arr = [7, 2, 8, 4, 3];
  const arr2 = new Array ( arr.length );
  for ( const [index,item] of arr.entries() ){
     const z = await func(item);
     // операции над z
     arr2[index] = z;
  }
  for ( const item of arr2 ){
    console.log ( item );
  }
} )()

Вот так всё выполняется в нужной последовательности.

Толково. Наглядно. И даже комментарии не нужны.

→ Ссылка