javascript function any(promises) { return new Promise((resolve, reject) => { const errors = []; let rejectedCount = 0; let resolved = false;
* Функция принимает массив промисов (считаем, что непустой) и возвращает промис.
javascript function any(promises) { return new Promise((resolve, reject) => { const errors = []; let rejectedCount = 0; let resolved = false;
Короткий ответ
Что ответить на собеседовании
Подробный разбор
Ответ с пояснениями
Условие
-
Функция принимает массив промисов (считаем, что непустой) и возвращает промис.
-
Если какой-то из переданных промисов резолвится (успешно выполняется), то возвращаемый промис резолвится с этим значением.
-
Если несколько промисов успешно выполняются, то возвращаемый промис резолвится
-
с первым успешным значением, вне зависимости от порядка промисов в массиве.
-
Если все переданные промисы реджектятся, то возвращаемый промис реджектится с ошибкой AggregateError, в которой сгруппированы все ошибки, с учетом порядка промисов.
-
AggregateError можно создавать таким образом: new AggregateError(errors, 'No Promise in any was resolved')
function any(promises) { // your code here }
Ответ
javascript function any(promises) { return new Promise((resolve, reject) => { const errors = []; let rejectedCount = 0; let resolved = false;
promises.forEach((p, index) => {
Promise.resolve(p)
.then(value => {
if (!resolved) {
resolved = true;
resolve(value);
}
})
.catch(error => {
errors[index] = error;
rejectedCount++;
if (rejectedCount === promises.length) {
reject(new AggregateError(errors, 'No Promise in any was resolved'));
}
});
});
}); }
Эта реализация создаёт новый промис, который резолвится при первом успешном выполнении любого из переданных промисов. Если все промисы отклоняются, возвращается AggregateError с массивом ошибок в порядке исходного массива.