.then()回调的返回值是否以任何方式影响原始的Promise?

时间:2018-09-29 20:30:36

标签: javascript promise

我正在读一本名为You dont know JS的书。在本文中,作者正在解释为什么promise.then()的成功回调中的错误没有被设计为捕获在同一promise.then()中的错误回调中。换句话说:

 somePromise.then(
        function success(msg){
            throw new Error()//Line A
        },
        function error(err){
            //error at Line A will not be caught here
        }
    );

这是本书的实际内容:

var p = new Promise( function(resolve,reject){
    resolve( 42 );
} );

p.then(
    function fulfilled(msg){
        foo.bar(); //Line C: will throw error because foo is null
        console.log( msg ); // never gets here :(
    },
    function rejected(err){//Line D
        // never gets here either :(
    }
);
  

为什么不能只调用我们在那里定义的错误处理程序(他在谈论D行的回调)?表面上似乎是一种逻辑行为。但这违反了承诺一旦解决即不变的基本原则。 p已经满足了值42,因此以后不能仅仅因为观察p的分辨率有误就将其更改为拒绝。

我对此行有疑问:

p已经满足了值42,因此以后不能仅因为观察p的分辨率时出错而将其更改为拒绝。

IMO,即使将C行中的错误设计为在D行中捕获,也不会对原始承诺(p)产生任何影响。仅仅是因为.then()将返回新承诺,而该新承诺与原始承诺毫无关系。作者似乎认为不是。恕我直言,他们应该说些什么:

在C行中引发错误时,已经创建了一个新的被拒绝的Promise,因此以后不能在D行进行回调,因为被拒绝的Promise是不可变的Promise

我在这里想念东西吗?

内容来源:link

1 个答案:

答案 0 :(得分:0)

这令人困惑。我认为作者要表达的观点是这样的

  1. rejected仅在p被拒绝的情况下运行
  2. 如果C行中的异常导致对rejected处理程序的调用,则它需要拒绝p来完成
  3. 由于p是不可变的,并且不能从其上的then处理程序中拒绝,因此C行不能引起该调用

这有点像循环推理,因为从我们的推论中也可以得出#1也将遵循C行不会导致rejected运行的情况。我们只需要接受#1作为合理的设计选择即可。

但是,是的,您对此事的理解是completely fine