Создание функции, имитирующей Promise.allSettled

Каждый вход обрабатывается двумя callbacks: успех записывает fulfilled/value, ошибка — rejected/reason. Общий Promise завершается после всех записей.

Короткий ответ

Что ответить на собеседовании

Каждый вход обрабатывается двумя callbacks: успех записывает fulfilled/value, ошибка — rejected/reason. Общий Promise завершается после всех записей.

Подробный разбор

Ответ с пояснениями

Условие

Необходимо реализовать функцию allSettled(), которая воспроизводит поведение стандартного метода Promise.allSettled.

function allSettled(inputs) {}

allSettled([
  new Promise((resolve) => setTimeout(() => resolve(1), 1000)),
  Promise.reject(2),
  Promise.resolve(3),
]).then(console.log);

// [
//   { "status": "fulfilled", "value": 1 },
//   { "status": "rejected", "reason": 2 },
//   { "status": "fulfilled", "value": 3 }
// ]

Функция должна принимать массив промисов (или значений, совместимых с промисами) и возвращать новый промис, который завершится после того, как завершатся все переданные. В результате необходимо получить массив объектов, каждый из которых содержит поле status со значением "fulfilled" или "rejected" и соответствующее поле value или reason с результатом или причиной отклонения.

Ответ

Каждый вход обрабатывается двумя callbacks: успех записывает fulfilled/value, ошибка — rejected/reason. Общий Promise завершается после всех записей.

function allSettled(inputs) {
  return new Promise(resolve => {
    const values = Array.from(inputs);
    const result = new Array(values.length);
    let remaining = values.length;
    if (!remaining) return resolve(result);
    function complete(index, entry) {
      result[index] = entry;
      if (--remaining === 0) resolve(result);
    }
    values.forEach((value, index) => Promise.resolve(value).then(
      item => complete(index, { status: 'fulfilled', value: item }),
      error => complete(index, { status: 'rejected', reason: error })
    ));
  });
}

Порядок результата соответствует входному, не времени завершения. Ошибка отдельного Promise не отклоняет общий, но ошибка чтения самого входного iterable может отклонить его через executor.

ИИ-помощник для собеседований

Хочешь уверенно проходить собеседования?

Попробуй ИИ-помощник для собеседований: слышит вас и собеседника, анализирует экран, подсказывает ответы в реальном времени, работает без VPN и не попадает в захват экрана.

Подробнее