什么是未处理的承诺拒绝?
为了学习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/reject – https://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() {}
然后,我检查了这些数据,修改了这些无效数据,消失了。