Распространение ошибок в цепочке Promise не работает должным образом - PullRequest
0 голосов
/ 09 ноября 2018

Я изучаю цепочку в JS Promises с этого сайта. На основе примера высокого уровня я написал следующий код, чтобы лучше понять распространение ошибок.

var promise = new Promise((resolve, reject) => {
    reject('Rejected!');
});

promise.then(()=>new Promise ((resolve, reject) => resolve('Done!')), () => console.log('Failure of first Promise'))
       .then(() => console.log('Success of nested Promise'), () => console.log('Failure of nested Promise'));

console.log('This will be still printed first!');

Здесь, когда я отклоняю первое обещание, оно дает запись Failure of first Promise, а затем Success of nested Promise.

Теперь мне интересно, как происходит обратный вызов успеха вложенного Promise? Как объяснено в вышеупомянутой статье, ясно, что даже одно обещание не выполнено (отклонено), обратный вызов сбоя должен быть вызван.

Что мне здесь не хватает? Спасибо.

Ответы [ 3 ]

0 голосов
/ 09 ноября 2018

Код, который вы написали, похож на

var promise = new Promise((resolve, reject) => { reject('Rejected!'); });
promise
    .then(()=>new Promise ((resolve, reject) => resolve('Done!')))
    .catch(() => console.log('Failure of first Promise'))
    .then(() => console.log('Success of nested Promise'))
    .catch(() => console.log('Failure of nested Promise')); 
    console.log('This will be still printed first!');

, так как catch также возвращает обещание, then, связанный с catch, также будет запущен, если есть только один catch в конце всех then, этот улов будет запущен без какого-либо then.

вы можете сделать следующее, чтобы преодолеть эту проблему,

promise
    .then(()=>new Promise ((resolve, reject) => resolve('Done!')))
    .then(() => console.log('Success of nested Promise'))
    .catch(() => console.log('Failure of Promise')); 
    console.log('This will be still printed first!');
0 голосов
/ 09 ноября 2018

Это потому что

Метод catch () возвращает Promises

Источник MDN - Promise.prototype.catch ()

"use strict";

new Promise((resolve, reject) => {
  reject('Error');
}).catch(err => {
  console.log(`Failed because of ${err}`);
}).then(() => {
  console.log('This will be called since the promise returned by catch() is resolved');
});

Это будет лог

Ошибка из-за ошибки
Это будет вызвано, поскольку обещание, возвращаемое catch (), разрешено

0 голосов
/ 09 ноября 2018

Второй then обратный вызов ловит ошибку из предыдущего обещания (ловит как в try..catch). В данном конкретном случае (нет вероятности, что первые then обратные вызовы приведут к отклонению), это то же самое, что и:

promise // rejected promise
.then(()=>new Promise ((resolve, reject) => resolve('Done!'))) // skips rejected promise
.catch(() => console.log('Failure of first Promise')) // results in resolved promise
.then(() => console.log('Success of nested Promise')) // chains resolved promise
.catch(() => console.log('Failure of nested Promise')); // skips resolved promise
...