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

Полифил Promise.all

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

Как работает all

Допустим, у нас есть три промиса:

  • p1 резолвится значением "🍎" через 2 секунды
  • p2 резолвится значением "🍋" через 3 секунды
  • p3 резолвится значением "🍉" через 1 секунду

Тогда all принимает эти промисы и возвращает новый промис. Через 3 секунды, когда зарезолвится p2 (последним по времени), итоговый промис резолвится массивом с результатами промисов.

all([p1, p2, p3]).then(arr => { console.log(arr); // arr === ["🍎", "🍋", "🍉"] });

Дополнительные требования

Подробное описание того, как работает Promise.all можно прочитать на mdn.

  • all принимает iterable, например, Array или Set.
  • Элементами этого iterable могут быть промисом или не промисом.
  • Если значение в iterable не является промисом, то оно в том же виде попадает в ответ.
  • Итоговый промис резолвится массивом с результатами промисов в том же порядке, в каком промисы находились в iterable.
  • Если передается пустой iterable, итоговый промис резолвится пустым массивом.
  • Итоговый промис реджектится, когда реждектится любой из промисов, значением этого реджектнутого промиса.

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

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")); all([p1, p2, p3, p4]).then( value => console.log("1 >>>", value), reason => console.log("2 >>>", reason), );