为了学习Angular 2,我正在尝试他们的教程。

我得到一个这样的错误:

(node:4796) UnhandledPromiseRejectionWarning: Unhandled promise rejection (r                                                                                                     ejection id: 1): Error: spawn cmd ENOENT
[1] (node:4796) DeprecationWarning: Unhandled promise rejections are deprecated.
In the future, promise rejections that are not handled will terminate the Node.
js process with a non-zero exit code.

我在SO中浏览了不同的问题和答案,但没有找到什么是“未处理的承诺拒绝”。

谁能简单地告诉我它是什么,也什么错误:产卵cmd ENOENT是,当它出现时,我必须检查摆脱这个警告?


当前回答

这个错误的起源在于每个promise都被期望处理promise拒绝,即有一个.catch(…)。您可以通过如下所示在代码中的promise中添加.catch(…)来避免同样的情况。

例如,函数PTest()将基于全局变量somevar的值来解析或拒绝承诺

var somevar = false;
var PTest = function () {
    return new Promise(function (resolve, reject) {
        if (somevar === true)
            resolve();
        else
            reject();
    });
}
var myfunc = PTest();
myfunc.then(function () {
     console.log("Promise Resolved");
}).catch(function () {
     console.log("Promise Rejected");
});

在某些情况下,即使我们为承诺编写了.catch(..),也会出现“未处理的承诺拒绝”消息。这完全取决于你如何编写代码。下面的代码将生成“未处理的承诺拒绝”,即使我们正在处理catch。

var somevar = false;
var PTest = function () {
    return new Promise(function (resolve, reject) {
        if (somevar === true)
            resolve();
        else
            reject();
    });
}
var myfunc = PTest();
myfunc.then(function () {
     console.log("Promise Resolved");
});
// See the Difference here
myfunc.catch(function () {
     console.log("Promise Rejected");
});

不同之处在于,.catch(…)不是作为链处理,而是作为单独的处理。由于某些原因,JavaScript引擎将其视为承诺,而没有未处理的承诺拒绝。

其他回答

当Promise使用.reject()完成,或者在异步执行的代码中抛出异常,而没有.catch()处理拒绝时,就会出现这种情况。

被拒绝的承诺就像一个向应用程序入口点冒出来的异常,并导致根错误处理程序产生该输出。

另请参阅

https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/reject https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

当我实例化一个promise时,我将生成一个异步函数。如果函数运行正常,那么我调用RESOLVE,然后流继续在RESOLVE处理程序中,在then中。如果函数失败,则通过调用REJECT终止函数,然后流在CATCH中继续。

在NodeJs中,拒绝处理程序被弃用。你的错误只是一个警告,我在node.js github中阅读了它。我找到了这个。

DEP0018:未处理的承诺拒绝 类型:运行时 不赞成未处理的承诺拒绝。将来,没有处理的promise拒绝将使用非零退出码终止Node.js进程。

在向数据库发送数据之前,尝试不要关闭连接。删除client.close ();从你的代码,它会工作得很好。

在我的例子中是Promise,没有拒绝也没有解决,因为我的Promise函数抛出了一个异常。此错误导致UnhandledPromiseRejectionWarning消息。

"弃用警告:未处理的承诺拒绝已弃用"

TLDR: promise具有resolve和reject,在不使用catch来处理它的情况下进行reject是不推荐的,所以你至少必须在顶级有一个catch。