异步等待承诺上的UnhandledPromiserEjectionWarning
我有这个代码:
function foo() {
return new Promise((resolve, reject) => {
db.foo.findOne({}, (err, docs) => {
if (err || !docs) return reject();
return resolve();
});
});
}
async function foobar() {
await foo() ? console.log("Have foo") : console.log("Not have foo");
}
foobar();
其结果是:
(节点:14843)UnhandledPromiserEjectionWarning:未处理的承诺拒绝(拒绝ID:1):false
(节点:14843)[DEP0018]否决警告:未处理的承诺拒绝被否决。 将来,没有处理的承诺拒绝将使用非零退出代码终止Node.js进程。
注意:我知道我可以这样解决这个问题:
foo().then(() => {}).catch(() => {});
但是我们又“回到”回调异步样式。
我们如何解决这个问题?
将代码包装在try-catch
块中。
async function foobar() {
try {
await foo() ? console.log("Have foo") : console.log("Not have foo");
}
catch(e) {
console.log('Catch an error: ', e)
}
}
不需要then(()=>{})。catch(()=>{})
,因为catch
不一定应该在then
之后。
UnhandledPromiserEjectionWarning
表示承诺没有与Catch
同步链接,这会导致未处理的拒绝。
在async.。await
中,应使用try.。catch
捕获错误:
async function foobar() {
try {
await foo() ? console.log("Have foo") : console.log("Not have foo");
} catch (error) {
console.error(error);
}
}
另一种方法是在顶层处理错误。 如果foobar
是应用程序入口点,并且不应该链接到其他任何地方,则它是:
foobar().catch(console.error);
foo
的问题是它不提供有意义的错误。 它最好是:
if (err || !docs) return reject(err);
而且,大多数流行的基于回调的库都有promise对应项,以避免New promise
。 它mongoist
用于mongojs
。