AndrewN1
@AndrewN1

Почему async/await в Array.prototype.map работает как-то не предсказуемо(для меня)?

Код:
function asyncThing(value) {
  return new Promise((resolve, reject) => {
    setTimeout(() => {
      resolve(value);
    }, 1000);
  });
}

async function main() {
  let arr = [1, 2, 3, 4, 5].map(async (value) => { // (0)
    let v = await asyncThing(value); // (1)

    return v * 2; // (2)
  });

  console.log(arr); // (3)
}

main();


С функцией asyncThing все понятно, эмулируем задержку.
  • (0) - в .map пихаем асинхронную функцию
  • (1) - по плану должно подождать, пока промис перейдет в состояние выполненного и потом продолжить работу
  • (2) - в новый массив как бы должно попасть удвоенное значение(ну точнее промис, в состоянии выполненного со удвоенным значением)
  • (3) - но в результате, я получаю массив с ожидающими промисами.

[ Promise { }, .......]


Может я что-то пропустил в мат.части. Такое ощущение будто в .map асинхронная функция не дожидается своих await, а сразу возвращает промис.

Вопрос: что не так?
  • Вопрос задан
  • 9774 просмотра
Решения вопроса 1
0xD34F
@0xD34F Куратор тега JavaScript
Такое ощущение будто в .map асинхронная функция не дожидается своих await, а сразу возвращает промис.

Так точно. Функция, переданная в map, вызывается без всяких await'ов.

Хотите массив со своими удвоенными значениями - используйте Promise.all:

const arr = await Promise.all([1, 2, 3, 4, 5].map(async (value) => 2 * await asyncThing(value)));

console.log(arr); // [2, 4, 6, 8, 10]
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
19 апр. 2024, в 13:31
10000 руб./за проект
19 апр. 2024, в 13:12
35000 руб./за проект
19 апр. 2024, в 13:06
6000 руб./за проект