Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/xcode/7.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 简单未处理PromisejectionWarning_Node.js_Promise_Try Catch - Fatal编程技术网

Node.js 简单未处理PromisejectionWarning

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 =>

当我尝试运行此程序时,会收到“UnhandledPromisejectionWarning”。但最后一个“catch”还是用正确的“err”对象接收了控制。 我得到两个警告:

未处理的PromisejectionWarning

PromisejectionHandledWarning

如果我评论“返回延迟(5000)”,一切正常。 为什么Node.JS会在我之前处理“promiseErr”

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
本身的异常确实未被破坏-因此这不是编写代码的真正安全方法。

谢谢,我理解。我只是认为“承诺”会在我决定处理它之前保持它的状态。当然,如果你觉得这个答案回答了你的问题,那么请考虑在某个时候接受它。