Promise.all возвращает промис, который отклоняется при отклонении любого из переданных all обещаний. Например следующий код:
const a = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("resolve 1");
resolve(1);
}, 2000);
});
const b = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("reject 2");
reject(2);
}, 1000);
});
const c = new Promise((resolve, reject) => {
console.log("resolve");
resolve(3);
});
Promise.all([a, b, c]).then(
r => {
console.log(r);
},
() => {
console.log("err");
},
);
выведет
resolve 3
reject 2
err
resolve 1
т.е. все завершилось без ожидания завершения промиса a (resolve 1 выводится после err). Вопрос в том, как дождаться, пока все промисы будут выполнены и/или отклонены?
Ответ
Очень просто: замаскировать ошибку через вызов catch
const a = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("resolve 1");
resolve(1);
}, 2000);
});
const b = new Promise((resolve, reject) => {
setTimeout(() => {
console.log("reject 2");
reject(2);
}, 1000);
});
const c = new Promise((resolve, reject) => {
console.log("resolve 3");
resolve(3);
});
Promise.all([a, b, c].map(p => p.catch(x => console.error(x)))).then(
r => {
console.log(r);
}
);
Результат: [1, undefined, 3].
Комментариев нет:
Отправить комментарий