异步等待承诺上的 UnhandledPromiseRejectionWarning

新手上路,请多包涵

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] DeprecationWarning:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将以非零退出代码终止 Node.js 进程。

注意:我知道我可以这样解决这个问题:

 foo().then(() => {}).catch(() => {});

但随后我们“回到”回调异步风格。

我们如何解决这个问题?

原文由 Raz Buchnik 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 283
2 个回答

将您的代码包装在 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)
  }
}

原文由 Raghav Garg 发布,翻译遵循 CC BY-SA 4.0 许可协议

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);

此外,大多数流行的基于回调的库都承诺要避免 new Promise 。它 mongoist 对于 mongojs

原文由 Estus Flask 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题