什么是未处理的承诺拒绝?

新手上路,请多包涵

为了学习 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 ,它何时出现以及我必须检查什么才能消除此警告?

原文由 Mohammad Sadiqur Rahman 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 728
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");
});

在某些情况下,即使我们为 promise 编写了 .catch(..) ,也会出现 “未处理的 promise 拒绝” 消息。这完全取决于您如何编写代码。以下代码将生成 “未处理的承诺拒绝” ,即使我们正在处理 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 引擎将其视为没有未处理的承诺拒绝的承诺。

原文由 Daksh Gupta 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题