Асинхронный JavaScriptСтатические методы промисовeasy

Полифил Promise.race

Своя реализация существующего метода и называется полифилом. Необходимо реализовать полифил стандартного метода Promise.race.

Что принимает race

Функция race принимает iterable, например, Array или Set. У iterable нет длины, но, например, по нему можно пройти циклом for-of.

Что возвращает race

Функция race возвращает промис, который завершается значением и статусом первого завершившегося промиса из коллекции. Если в iterable есть элементы, не являющиеся промисом, то итоговый промис зарезолвится первым из них.

Пример 1

  • p1 резолвится значением "🐎" через 2 секунды
  • p2 резолвится значением "🐢" через 5 секунд
  • p3 реджектится значением "👻" через 1 секунду

Тогда race принимает эти промисы и возвращает новый промис. Через 1 секунду он реджектится значением "👻"

Пример 2

Теперь пусть в коллекции 3 таких промиса:

  • p1 резолвится значением "🐎" через 2 секунды
  • p2 резолвится значением "🐢" через 5 секунд
  • p3 реджектится значением "👻" через 3 секунды

Тогда race принимает эти промисы и возвращает новый промис. Через 2 секунды он резолвится значением "🐎"

Код для тестирования

const rand = () => Math.random() * 2000; const p1 = new Promise(r => setTimeout(r, rand(), "A")); const p2 = new Promise(r => setTimeout(r, rand(), "B")); const p3 = new Promise(r => setTimeout(r, rand(), "C")); const p4 = new Promise(r => setTimeout(r, rand(), "D")); race([p1, p2, p3, p4]).then( value => console.log("1 >>>", value), reason => console.log("2 >>>", reason), );