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

为了学习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. 

我在这里经历了不同的问题和答案,但是找不到什么是“未处理的承诺拒绝”。

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

这个错误的根源在于,每一个承诺都有望处理承诺,即拥有一个.catch(…) 。 您可以通过在代码中添加.catch(…)来避免这种情况,如下所示。

例如,函数PTest()将根据全局variablessomevar的值来parsing或拒绝一个promise

 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,下面的代码也会产生“未处理的promise promise”

 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(…)作为链处理,而是分开处理。 出于某种原因,Java脚本引擎将其视为承诺,而没有未经处理的承诺拒绝

这是当一个Promise.reject()完成的时候,或者在一个asynchronous执行的代码中抛出一个exception,并且.catch()没有处理这个拒绝。

被拒绝的承诺就像是一个exception,它向应用程序入口点冒泡,并导致根error handling程序产生该输出。

另见 – https://developer.mozilla.org/en/docs/Web/JavaScript/Reference/Global_Objects/Promise/rejecthttps://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference / Global_Objects / Promise – https://developer.mozilla.org/zh-CN/docs/Web/JavaScript/Reference/Global_Objects/Promise/catch

承诺可以被拒绝后“处理”。 也就是说,在提供catch处理程序之前,可以调用promise的拒绝callback函数。 这种行为是有点麻烦,因为我可以写…

 var promise = new Promise(function(resolve) { kjjdjf(); // this function does not exist }); 

…在这种情况下,诺言被无声地拒绝了。 如果忘记添加catch处理程序,代码将继续无提示地运行。 这可能会导致徘徊和难以发现的错误。

在Node.js的情况下,有处理这些未处理的Promise拒绝和报告问题的谈话。 这使我ES7asynchronous/等待。 考虑这个例子:

 async function getReadyForBed() { let teethPromise = brushTeeth(); let tempPromise = getRoomTemperature(); // Change clothes based on room temperature let temp = await tempPromise; // Assume `changeClothes` also returns a Promise if(temp > 20) { await changeClothes("warm"); } else { await changeClothes("cold"); } await teethPromise; } 

在上面的例子中,假设在getRoomTemperature被满足之前,牙齿的好处被拒绝(错误:用牙膏!)。 在这种情况下,会有一个未处理的诺言排斥,直到等待牙齿的好转。

我的观点是……如果我们认为未处理的Promise拒绝是一个问题,那么稍后由await处理的Promise可能会不经意地报告为错误。 再次,如果我们认为未处理的Promise拒绝不成问题,合法的错误可能不会被报告。

对此有何想法?

这与Node.js项目中的讨论有关:

默认未处理拒绝检测行为

如果你这样写代码:

 function getReadyForBed() { let teethPromise = brushTeeth(); let tempPromise = getRoomTemperature(); // Change clothes based on room temperature return Promise.resolve(tempPromise) .then(temp => { // Assume `changeClothes` also returns a Promise if (temp > 20) { return Promise.resolve(changeClothes("warm")); } else { return Promise.resolve(changeClothes("cold")); } }) .then(teethPromise) .then(Promise.resolve()); // since the async function returns nothing, ensure it's a resolved promise for `undefined`, unless it's previously rejected } 

当getReadyForBed被调用时,它将同步创build最后的(不返回的)promise – 与其他任何promise(当然,根据引擎不同,可能没有任何内容)会有相同的“未处理的拒绝”错误。 (我觉得很奇怪你的函数不会返回任何东西,这意味着你的asynchronous函数产生一个未定义的承诺。

如果我现在没有捕捉到一个Promise,并且稍后添加一个Promise,那么大多数“未处理的拒绝错误”实现将在我稍后处理时实际收回警告。 换句话说,asynchronous/等待不会以我能看到的任何方式改变“未处理拒绝”的讨论。

为了避免这个陷阱,请这样写代码:

 async function getReadyForBed() { let teethPromise = brushTeeth(); let tempPromise = getRoomTemperature(); // Change clothes based on room temperature var clothesPromise = tempPromise.then(function(temp) { // Assume `changeClothes` also returns a Promise if(temp > 20) { return changeClothes("warm"); } else { return changeClothes("cold"); } }); /* Note that clothesPromise resolves to the result of `changeClothes` due to Promise "chaining" magic. */ // Combine promises and await them both await Promise.all(teethPromise, clothesPromise); } 

请注意,这应该防止未处理的承诺拒绝。

我用mongoose来连接我的mongodb。 当我尝试将无效模式推送到数据库时,发生在我身上

 for() {} 

然后,我检查了这些数据,修改了这些无效数据,消失了。