承诺:拒绝的一些问题

时间:2018-08-29 03:12:36

标签: javascript promise es6-promise

我在“ 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 errorpromise1 result
我不知道为什么不promise2 errorpromise1 error
有什么问题和解决方案吗?
这是预览链接:http://plnkr.co/edit/RTc1wYfO8e1YPUrXM6GN

2 个答案:

答案 0 :(得分:4)

当承诺被拒绝时,控件会跳至链中最接近的拒绝处理程序

因此,这里.catch块正常完成。因此,将调用下一个成功的处理程序。否则它可能会返回某些结果,就一样。

得出结果

  

结果是:promise2 errorpromise1 result

因此,您可以根据需要设置多个.then,然后最后使用单个.catch来处理所有这些错误。

但是要获得以下结果

  

我不知道为什么不promise2 errorpromise1 error

您需要重新引发错误

throw error;

.catch块在这里分析错误并再次抛出该错误:

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

}

答案 1 :(得分:1)

如果您处理任何promise链中的拒绝,那么这将使结果链得以实现,直到发现错误,然后它才被拒绝。考虑一下同步代码,您是否希望它能打印error Aerror 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的工作做对了。