我正在读一本名为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
答案 0 :(得分:0)
这令人困惑。我认为作者要表达的观点是这样的
rejected
仅在p
被拒绝的情况下运行rejected
处理程序的调用,则它需要拒绝p
来完成p
是不可变的,并且不能从其上的then
处理程序中拒绝,因此C行不能引起该调用这有点像循环推理,因为从我们的推论中也可以得出#1也将遵循C行不会导致rejected
运行的情况。我们只需要接受#1作为合理的设计选择即可。
但是,是的,您对此事的理解是completely fine。