Обещания: некоторые проблемы с браком - PullRequest
0 голосов
/ 29 августа 2018

У меня есть проблема с обещанием в "Angular 2".

Пожалуйста, смотрите мой код ниже:

getPromise1().then((result) => { 
        console.log("promise1 result"); 
    }, (error) => { 
        console.log("promise1 error"); 
    });

function getPromise1() {
    return getPromise2().then((result) => {
        console.log("promise2 result");
    }, (error) => {
        console.log("promise2 error");
    });

}

function getPromise2() {
    return new Promise((resolve, reject) => {
        reject("error");
    });
}

И результат: promise2 error и promise1 result.
Я не знаю, почему не promise2 error и promise1 error
Любая проблема и решение для этого случая?
Это ссылка для предварительного просмотра: http://plnkr.co/edit/RTc1wYfO8e1YPUrXM6GN

Ответы [ 2 ]

0 голосов
/ 29 августа 2018

Когда обещание отклоняется, элемент управления переходит к ближайшему обработчику отклонения вниз по цепочке .

Итак, блок .catch завершается нормально. Итак, следующий успешный обработчик называется. Или это могло бы вернуть что-то, что было бы так же.

Отсюда и результат

И результат: promise2 error и promise1 result.

Таким образом, вы можете иметь столько. Than, сколько мы хотим, а затем использовать один .catch в конце для обработки ошибок во всех них.

Но чтобы получить следующий результат

Не знаю, почему нет promise2 error и promise1 error

нужно заново выкинуть ошибку

throw error;

И здесь блок .catch анализирует ошибку и выдает ее снова:

function getPromise1() {
    return getPromise2().then((result) => {
        console.log("promise2 result");
    }, (error) => {
        console.log("promise2 error");
        throw error;
    });

}
0 голосов
/ 29 августа 2018

Если вы обрабатываете отказ в какой-либо цепочке обещаний, то это приведет к тому, что результирующая цепочка будет выполнена до тех пор, пока не будет найдена ошибка, тогда она вернется к отклонению. Подумайте об этом с точки зрения кода синхронизации, ожидаете ли вы, что это напечатает error A и error B?

function myFnA(){
    throw new Error('A is bad');
}

function myFnB(){
   try {
      myFnA();
      console.log('good A');
   } catch(e){
      console.log('error A');
   }
}

function myFnC(){
   try {
      myFnB();
      console.log('good B');
   }
   catch(e){
      console.log('error B');
   }
}

myFnC();

myFnB исправляет myFnA ошибку. Так что myFnB делает свою работу правильно.

...