Выбор ответа Middle Реализация с нуля обновлено

Реализация Promise.race

Вопрос

Какая реализация Promise.race верная?

Попробуйте сами

Выберите вариант, и откроется разбор.

Показать ответ и разбор

Коротко

Правильный ответ: (list) = new Promise((res, rej) = list.forEach((p) = Promise.resolve(p).then(res, rej))). Промис меняет состояние один раз, поэтому достаточно подписать resolve и reject на все элементы: первый завершившийся, успешно или с ошибкой, определит результат, остальные вызовы проигнорируются.

Варианты ответа

  1. (list) => new Promise((res, rej) => list.forEach((p) => Promise.resolve(p).then(res, rej)))правильный ответ
  2. (list) => Promise.all(list.map((p) => Promise.resolve(p))).then((values) => values[0])
  3. (list) => new Promise((res, rej) => list.forEach((p) => p.then(res)))
  4. (list) => new Promise((res, rej) => Promise.resolve(list[0]).then(res, rej))

Разбор

Промис меняет состояние один раз, поэтому достаточно подписать resolve и reject на все элементы: первый завершившийся, успешно или с ошибкой, определит результат, остальные вызовы проигнорируются. Promise.resolve позволяет передавать и не-промисы. Вариант через Promise.all ждёт всех и берёт первый по порядку, а не по времени. Третий не обрабатывает ошибки и падает на не-промисах. Четвёртый просто берёт первый элемент списка, не дожидаясь остальных.

Ответьте сами, а не прочитайте

В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.