UnhandledPromiseRejectionWarning,没有就没有承诺

时间:2018-07-10 18:49:53

标签: javascript node.js

最近,在测试我的代码时,我经常遇到此错误。刚才我再次尝试执行包含错误的同步代码时遇到此错误:

(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数组。为什么我会得到一个承诺错误,就像实际上有一个承诺错误?

2 个答案:

答案 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);
  }
})()