Node.js 简单未处理PromisejectionWarning
当我尝试运行此程序时,会收到“UnhandledPromisejectionWarning”。但最后一个“catch”还是用正确的“err”对象接收了控制。 我得到两个警告: 未处理的PromisejectionWarning PromisejectionHandledWarning 如果我评论“返回延迟(5000)”,一切正常。 为什么Node.JS会在我之前处理“promiseErr”Node.js 简单未处理PromisejectionWarning,node.js,promise,try-catch,Node.js,Promise,Try Catch,当我尝试运行此程序时,会收到“UnhandledPromisejectionWarning”。但最后一个“catch”还是用正确的“err”对象接收了控制。 我得到两个警告: 未处理的PromisejectionWarning PromisejectionHandledWarning 如果我评论“返回延迟(5000)”,一切正常。 为什么Node.JS会在我之前处理“promiseErr” const delay = (ms: number) => new Promise(res =>
const delay = (ms: number) => new Promise(res => setTimeout(res, ms));
let promiseErr = new Promise( (resolve, reject) => {
reject(new Error("__error__"));
});
let promiseOk = new Promise( (resolve, reject) => {
resolve();
});
promiseOk
.then( () => {
return delay(5000);
})
.then( () => {
return promiseErr;
})
.then( () => {
console.log("OK");
})
.catch( (err) => {
console.log(`ERR ${err}`);
});
您异步(5000毫秒后)拒绝了承诺。Node.js通过查看未同步处理的承诺或在microtick内(在
然后内)检测未处理的承诺
由于Node.js无法“确定”何时拒绝承诺未得到处理,因此它会在安全方面出错并向您发出警告。通常最好添加捕获处理程序,以尽可能多地同步地承诺错误
您可以通过在创建警告时将.catch(()=>{})添加到promiseErr
来抑制警告,该警告将处理异常:
var promiseErr = ...
promiseErr.catch(() => {}); // add a catch handler without changing the original
一般来说,解决方案是不要以这种容易出错的方式编写代码。如果promiseOk
或delay
拒绝(哪个节点无法知道)-那么promiseer
本身的异常确实未被破坏-因此这不是编写代码的真正安全方法。谢谢,我理解。我只是认为“承诺”会在我决定处理它之前保持它的状态。当然,如果你觉得这个答案回答了你的问题,那么请考虑在某个时候接受它。