提问者:小点点

异步await promise上的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]否决警告:未处理的承诺拒绝被否决。 将来,没有处理的承诺拒绝将使用非零退出代码终止Node.js进程。

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

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

但是我们又“回到”回调异步样式。

我们如何解决这个问题?


共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)
  }
}

匿名用户

不需要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

相关问题