什么是未经处理的应许拒绝?

为了学习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中经历了不同的问题和答案,但无法找出“未经处理的承诺拒绝”是什么。

任何人都可以简单地解释我它是什么,以及它是什么,当它出现时以及我必须检查什么以摆脱这个警告?Error: spawn cmd ENOENT


答案 1

这个错误的根源在于,每个承诺都应该处理承诺拒绝,即有一个.catch(...) 。您可以通过将 .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");
});

不同之处在于,您不是作为链处理,而是作为单独的处理。出于某种原因,JavaScript引擎将其视为承诺,而不会拒绝未处理的承诺。.catch(...)


答案 2

这是在执行的代码中完成或抛出异常并且没有处理拒绝的情况。Promise.reject()async.catch()

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

另请参见