这个问题在这里已有答案:
我有以下代码
function request(status){
return new Promise((resolve, reject) => {
setTimeout(() => {
if(status){
resolve('Success');
} else {
reject('error');
}
}, 1000);
});
}
let promise = request(false);
promise.then( response => {
console.log('response' , response);
});
promise.catch( (err) => {
console.log('got Error', err);
});
即使我发现拒绝回复,也会抛出跟随错误
得到错误错误(节点:11252)UnhandledPromiseRejectionWarning:错误(节点:11252)UnhandledPromiseRejectionWarning:未处理的承诺拒绝 . 此错误源于通过抛出异步函数而没有catch块,或者拒绝未使用.catch()处理的promise . (拒绝ID:1)(节点:11252)[DEP0018]弃用警告:不推荐使用未处理的拒绝承诺 . 将来,未处理的承诺拒绝将使用非零退出代码终止Node.js进程 .
但如果我删除 then 块然后它工作正常, NO STACK TRACE ERROR ON THE CONSOLE
function request(status){
return new Promise((resolve, reject) => {
setTimeout(() => {
if(status){
resolve('Success');
} else {
reject('error');
}
}, 1000);
});
}
let promise = request(false);
promise.catch( (err) => {
console.log('got Error', err);
});
输出:
得到错误错误
我不明白为什么它以这种方式运作?
3 回答
这里的关键 - 以及使用承诺的关键之一 - 是 then and catch create new promises . 因此,未被处理的被拒绝的承诺是由
then
创建的:这是您看到承诺链的原因之一:
目前,三项承诺仍在创建(原从
request
,一个从then
,并从catch
的一个),但拒绝是由于最终catch
处理程序,他们三个人都处理 .then
和catch
创建的承诺如下:如果基础承诺解决:
如果没有
then
处理程序,请使用原始承诺的解决方案解析如果有
then
处理程序,请将其命名为:如果处理程序返回一个thenable(一个类似promise的对象),请挂钩并根据是否可解析或拒绝来解析或拒绝
如果处理程序返回不可用的值,请使用该值解析
如果处理程序抛出错误,请拒绝该错误
如果潜在的承诺拒绝:
如果没有
catch
处理程序,请拒绝原始承诺的拒绝如果有一个
catch
处理程序,请调用它并完全按照上面的then
处理程序执行(根据返回或抛出的内容解析或拒绝)请看看以下两种可以处理的方法 .
在第一种方法中,一旦承诺在'then'内解决,你就会尝试处理承诺拒绝,否则你可以用.catch()链接.then() .
另请注意,只有在拒绝承诺时才会调用 then 中的错误块 . 但是即使存在任何其他js错误,也会调用catch块 .
Code Sandbox Link
promise.then()
创建一个新的承诺,其结算取决于promise
. 当promise
被拒绝时,promise.then()
创建的隐式承诺也被拒绝,并且没有catch()
子句来处理错误 .您需要做的是将
.catch()
链接到promise.then()
返回的承诺: