为了学习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是,当它出现时,我必须检查摆脱这个警告?
我在NodeJS中也遇到过类似的问题,罪魁祸首是forEach循环。注意forEach是一个同步函数(不是异步函数)。因此,它只是忽略了返回的承诺。
解决方案是使用for-of循环:
我得到错误的代码:
UnhandledPromiseRejectionWarning:未处理的承诺拒绝。此错误是由于在没有catch块的异步函数中抛出,或者由于拒绝未使用.catch()处理的promise而引起的。
如下:
permissionOrders.forEach( async(order) => {
const requestPermissionOrder = new RequestPermissionOrderSchema({
item: order.item,
item_desc: order.item_desc,
quantity: order.quantity,
unit_price: order.unit_price,
total_cost: order.total_cost,
status: order.status,
priority: order.priority,
directOrder: order.directOrder
});
try {
const dat_order = await requestPermissionOrder.save();
res.json(dat_order);
} catch(err){
res.json({ message : err});
}
});
以上问题的解决方法如下:
for (let order of permissionOrders){
const requestPermissionOrder = new RequestPermissionOrderSchema({
item: order.item,
item_desc: order.item_desc,
quantity: order.quantity,
unit_price: order.unit_price,
total_cost: order.total_cost,
status: order.status,
priority: order.priority,
directOrder: order.directOrder
});
try {
const dat_order = await requestPermissionOrder.save();
res.json(dat_order);
} catch(err){
res.json({ message : err});
}
};
这个错误的起源在于每个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引擎将其视为承诺,而没有未处理的承诺拒绝。