Значение Promise.all () после его отклонения показывает ['' PromiseStatus '']: разрешено, если присутствует блок catch - PullRequest
0 голосов
/ 24 июня 2018

У меня есть два обещания, одно из которых отклонено, а другое выполнено. Promise.all называется. Он выполнил блок catch в Promise.all, поскольку одно из обещаний было отклонено.

const promise1 = Promise.resolve('Promise 1 Resolved');
const promise2 = Promise.reject('Promise 2 Rejected');

const promise3 = Promise.all([promise1, promise2])
  .then(data => {
    console.log('Promise.all Resolved', data);
  })
  .catch(error => {
    console.log('Promise.all REJECTED', error);
  })
setTimeout(() => {
  console.log(promise1, promise2, promise3)
}, 200);

enter image description here

Если у меня нет перехвата Promise.all (), значение остается отклоненным, т.е.

const promise3 = Promise.all([promise1, promise2])
  .then(data => {
    console.log('Promise.all Resolved', data);
  })

Я что-то упускаю из обещаний.

Ответы [ 2 ]

0 голосов
/ 24 июня 2018

Я вижу, что это ответ, но я думаю, что могу уточнить немного больше.

Пожалуйста, помните, что каждый then() или catch() возвращает Promise. (Если у вас нет явного return в обратном вызове, оба вернут Promise.resolve(undefined)). Поэтому после того, как обещание выполнено, значением всей цепочки обещаний будет обещание, возвращаемое последним then(); Пример:

promise = Promise.resolve(1)
    .then(() => Promise.resolve(2))
    .then(() => Promise.resolve(3));
console.log(promise);
setTimeout(() => {
    console.log(promise)//Promise {<resolved>: 3}
}, 0)

catch() работает точно так же, как then(). Разница лишь в том, что он вызывается на rejected обещаниях, а не resolved. В следующем примере я просто заменяю все resolve на reject, чтобы продемонстрировать это.

promise = Promise.reject(1)
    .catch(() => Promise.reject(2))
    .catch(() => Promise.reject(3));
console.log(promise);
setTimeout(() => {
    console.log(promise)//Promise {<rejectd>: 3}
}, 0)

Теперь перейдем к вашему вопросу. Значение Promise.all() является отклоненным обещанием, поскольку одно из обещаний в массиве отклонено. Если у вас есть блок catch в цепочке, управление перейдет к тому блоку catch, который вернет Promise.resolve(undefined). Если у вас нет цепочки уловов в цепочке, вы получите то, что у вас есть: отклоненное обещание.

0 голосов
/ 24 июня 2018

A catch в Promise действует так же, как и блок try {} catch {}, поскольку вы зафиксировали состояние ошибки, и программа продолжит работать в обычном режиме.

Вот почему, когда вы опускаете catch, ваше состояние обещания равно "rejected".

Если после обнаружения ошибки вы хотите вернуть состояние обещания как отклоненное, вам необходимо вернуть отклоненное обещание из обработчика перехвата:

const promise3 = Promise.all([promise1, promise2])
    .catch(error => {
        console.log("REJECTED", error);
        return Promise.reject(error);
    });
console.log(promise3); // [[PromiseStatus]]: "rejected"

Аналогично throw внутри try {} catch { throw; } блока

...