最近,在测试我的代码时,我经常遇到此错误。刚才我再次尝试执行包含错误的同步代码时遇到此错误:
(async function() {
const characterProfile = await Model.findOne({'author': author.id}).catch(console.error);
if (!characterProfile) {msg.reply('No characters satisfied your criteria.'); return;}
var displayIndexes = charfields.isEqual("field", name); // <- error "name"
console.log(displayIndexes);
})();
我知道有一个错误,如果只是告诉我存在ReferenceError,那会很好,但是它说:
UnhandledPromiseRejectionWarning:未处理的承诺被拒绝 (拒绝ID:1):ReferenceError:未定义名称
[DEP0018] DeprecationWarning:未处理的Promise拒绝是 不推荐使用。将来,未处理的承诺拒绝 将使用非零退出代码终止Node.js进程。
因此,我担心DeprecationWarning将来会破坏我的代码,这将是一场灾难。 charfields.isEqual()
不是一个承诺,它是一个forEach循环,返回一个ID数组。为什么我会得到一个承诺错误,就像实际上有一个承诺错误?
答案 0 :(得分:2)
每次使用async
关键字时,您都会创建至少1个承诺。异步函数中的所有内容实际上都是承诺的一部分。
如果您在各处使用async
,并且您的应用程序有一个调用“主异步”功能的入口点,则可以处理类似以下的错误:
async main() {
// Run your app
}
// Call main when your code executes:
main().catch( e => { // do something with 'e' });
答案 1 :(得分:1)
异步函数返回Promise。您可以通过catch
例如调用IIFE的结果来证明这一点。
(async function() {
const characterProfile = await Model.findOne({'author': author.id}).catch(console.error);
if (!characterProfile) {msg.reply('No characters satisfied your criteria.'); return;}
var displayIndexes = charfields.isEqual("field", name); // <- error "name"
console.log(displayIndexes);
})().catch(err => console.log(err)); // Will log out the reference error
本质上,您的异步功能等效于以下内容:
(function() {
return Model.findOne({'author': author.id})
.then(characterProfile => {
if (!characterProfile) {msg.reply('No characters satisfied your criteria.'); return;}
var displayIndexes = charfields.isEqual("field", name); // <- error "name"
console.log(displayIndexes);
})
.catch(console.error);
})();
一种常见的处理方法是使用try / catch:
(async function() {
try {
const characterProfile = await Model.findOne({'author': author.id}).catch(console.error);
if (!characterProfile) {msg.reply('No characters satisfied your criteria.'); return;}
var displayIndexes = charfields.isEqual("field", name); // <- error "name"
console.log(displayIndexes);
} catch (err) {
console.log(err);
}
})()