Promise()构造函数中的错误未由.catch()方法处理

时间:2018-03-12 21:23:30

标签: javascript promise

当我在Chrome中运行以下内容时,我得到了一个" Uncaught(in promise)失败"错误讯息:



var p = new Promise(function(resolve){
	throw "failure";
})

p.then(function(){
	console.log("success");
})

p.catch(function(err){
	console.log(err);
});




如果我跑步,我不会收到错误:



var p = new Promise(function(resolve){
	throw "failure";
})

p.then(function(){
	console.log("success");
}).catch(function(err){
	console.log(err);
});




或者这个:



var p = new Promise(function(resolve){
	throw "failure";
}).catch(function(err){
	console.log(err);
});




这里发生了什么?我对Promises相对较新,所以我可能会错过一些简单的......

2 个答案:

答案 0 :(得分:0)

第一种情况对您不起作用,因为您试图在同一时间if (window.location.href.endsWith("/projets/")) { ... }直接从Promise中捕获错误,在这种情况下,您从{{1}中捕获错误}。另一方面,如果没有.then,您可以直接从Promise对象中捕获 .then.then的较短别名。 .catch方法返回Promise对象,仅处理初始承诺被拒绝的情况。它与调用.then具有相同的效果(这实际上是在引擎中发生的事情,catch()被翻译为Promise.prototype.then(undefined, ifRejected)。所以你不能放obj.catch(onRejected)。< / p>

答案 1 :(得分:0)

这里的课程。如果您将onReceivedHttpAuthRequest.then()处理程序直接链接到promise(不创建中间.catch()变量和中间承诺链),并且在结尾处有一个p处理程序每一个链条,你都不太可能(或许完全不可能)得到未经处理的承诺拒绝&#34;信息。

基于我在我自己的代码和堆栈溢出中看到的其他事件,在我看来,解释器或承诺库在某种程度上猜测未处理的拒绝情况何时发生并且不完美猜测。

在您的情况下,口译员发现.catch()没有p.then()处理程序,然后看到.catch()被拒绝。因此,该承诺链实际上没有p处理程序。因此,该承诺链将以拒绝结束,并且没有处理程序。这会触发警告。

没有足够的智慧可以看到有一个单独的.catch()或者没有认为有理由不显示警告。

正如您已经发现的那样,这将永远是安全的:

p.catch()

因为没有承诺链可以获得new Promise(function(resolve){ throw "failure"; }).then(function(data) { console.log(data); }).catch(function(err){ console.log(err); }); 没有捕获的拒绝。三思而后行根本保存对变量的承诺 - 只需创建一个承诺链(如果需要,可以在.catch()处理程序内部建立分支链)。我几乎从来没有发现需要将一个保存保存到一个变量中,除非偶尔我从一个函数返回它并在创建promise之后在函数中执行一些代码。通常,您可以这样做:

.then()