Каждый вход обрабатывается двумя callbacks: успех записывает fulfilled/value, ошибка — rejected/reason. Общий Promise завершается после всех записей.
Создание функции, имитирующей Promise.allSettled
Каждый вход обрабатывается двумя 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.