Вопрос №55909 от пользователя Дмитрий Боровик в уроке «Promise.all», курс «JS: Асинхронное программирование»

Дмитрий Боровик

Добрый день. Задание решил, но из двух похожих решений одно не работает. Это работает https://ru.hexlet.io/code_reviews/422972?submission_id=539050, это не работает https://ru.hexlet.io/code_reviews/422972?submission_id=539107. Визуально, они друг от друга отличаются только тем, что одно решено непрерывно цепочкой, другое разделено. Из тестов догадываюсь , что в Promise.all попадает 1 промис. В чем причина?

3 0

Дмитрий Боровик

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

0

Станислав Дзисяк

Приветствую, Дмитрий!

Из тестов догадываюсь , что в Promise.all попадает 1 промис. В чем причина?

Всё верно, именно в этом и дело. Второе решение не работает потому, что getFiles содержит один промис. Массив промисов в вашем решении формируется внутри второго вызова then() в результате вызова функции map(). Соответственно Promise.all() нужно использовать именно там, где появляется массив промисов.

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

Тут по-разному может быть, например массив промисов может быть получен в результате вызова асинхронной функции n раз. Но также у вас может быть и вручную сформировано несколько промисов, которые можно объединить в массив и передать в итоге в Promise.all(). В общем всё зависит от логики самого кода.

1

Maksim Litvinov

Добрый день, Дмитрий! По второму комментарию я вижу, что вы уже поняли в чем проблема. Функция Promise.all() принимает на вход массив промисов. Используйте отладочную печать, чтобы посмотреть, что находится в переменной getFiles. Массив промисов можно получить и получить и собрав его вручную, как в примере из урока:

const promise1 = fsp.readFile(inputPath1, 'utf-8');
  const promise2 = fsp.readFile(inputPath2, 'utf-8');
  // На вход идет МАССИВ из промисов
  const promise = Promise.all([promise1, promise2]);

или изначально обрабатывая массив:

onst promises = filepaths.map((filepath) => fsp.readFile(filepath, 'utf-8')
  .then((v) => ({ result: 'success', value: v }))
0

Используйте Хекслет по максимуму!

  • Задавайте вопросы по уроку
  • Проверяйте знания в квизах
  • Проходите практику прямо в браузере
  • Отслеживайте свой прогресс

Зарегистрируйтесь или войдите в свой аккаунт

Даю согласие на обработку персональных данных, соглашаюсь с «Политикой конфиденциальности» и «Условиями оказания услуг»

Рекомендуемые программы

С нуля до разработчика. Возвращаем деньги, если не удалось найти работу.

Иконка программы Фронтенд-разработчик
Профессия
Разработка фронтенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Python-разработчик
Профессия
Разработка веб-приложений на Django
25 мая 10 месяцев
Иконка программы PHP-разработчик
Профессия
Разработка веб-приложений на Laravel
25 мая 10 месяцев
Иконка программы Node.js-разработчик
Профессия
Разработка бэкенд-компонентов веб-приложений
25 мая 10 месяцев
Иконка программы Fullstack-разработчик
Профессия
Новый
Разработка фронтенд и бэкенд компонентов веб-приложений
25 мая 16 месяцев
Иконка программы Верстальщик
Профессия
Вёрстка с использованием последних стандартов CSS
в любое время 5 месяцев
Иконка программы Java-разработчик
Профессия
Разработка приложений на языке Java
25 мая 10 месяцев
Иконка программы Разработчик на Ruby on Rails
Профессия
Создает веб-приложения со скоростью света
25 мая 5 месяцев