Страницы

Поиск по вопросам

вторник, 9 октября 2018 г.

Как дождаться выполнения нескольких Promise аналогично Promise.all

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].

Комментариев нет:

Отправить комментарий