【问题标题】:Can I use Promise.prototype.catch inside async functions that is using await?我可以在使用 await 的异步函数中使用 Promise.prototype.catch 吗?
【发布时间】:2022-01-03 01:42:43
【问题描述】:

在使用await 的异步函数内部使用Promise.prototype.catch 有什么影响吗?

例如:

async funciton sendMessage(topic, bodyObj) {
  // implementation is not important
}

async function removeFromInventory(item, amount) {
  const storeData = await getSoreData(item)
  const removeResult = await inventory.removeFromStore(storeData.id, item.id, amount)
  sendMessage(
    Message.REMOVE_INVENTORY_SUCCESS, removeResult
  ).catch(log.error) // <== here, is it has downside and it is better to use try/catch?
  return removeResult
}

我不想 await 完成 sendMessage 并使用 .catch 处理拒绝,换句话说,避免未处理的拒绝。

【问题讨论】:

  • 这意味着它不再是同一个承诺链的一部分,但听起来这就是你正在寻找的特定行为。
  • 是的,你可以,但发明 async await 的原因之一是避免使用 catch,而是使用 try catch
  • @Ivandez 然后我需要等待它,这正是我想要避免的

标签: javascript async-await es6-promise


【解决方案1】:

在使用 await 的异步函数中使用 Promise.prototype.catch 有什么影响吗?

你使用它的方式,主要的含义是你正在“吃掉”错误。您记录错误,然后继续,就好像没有错误一样。如果这是设计意图,它会工作得很好。


至于一般主题,您可以将async/await.then().catch() 混合使用。它会起作用 - 没有语言禁止它。

也就是说,通常不建议将它们混合使用,因为这样会产生更混乱的代码处理。

我倾向于将async/await.catch() 混合使用的唯一一次是我想记录并“吃掉”一个错误,同时让其他一切继续,就好像没有错误一样。

例如,在删除函数内的临时文件时经常会发生这种情况,否则会使用 async/await

  fs.promises.unlink(tempFile).catch(err => console.log(err));

我这样做只是因为它更紧凑,用try/catch 包围它,我正在“吃掉”错误,因为如果失败并且主要操作已经成功完成,则没有任何用处可做。我也可能不会输入await,因为我实际上不需要主要操作来等待此清理完成,然后再将其返回完成。

为了比较,另一种方法是:

  try {
      await fs.promises.unlink(tempFile);
  } catch(e) {
      console.log(e);
  }

所以,如果这是您对sendMessage(...).catch() 的意图,那么这完全可以。这将记录错误,否则会“吃掉”错误,因此处理将继续进行,就好像没有错误一样。

另一方面,如果您希望将该错误传播回调用者,那么这根本不是您想要的,因为这不会发生。此代码处理错误并将其隐藏起来,避免传播回调用者。

【讨论】:

  • "我倾向于将 async/await 与 .catch() 混合使用的唯一一次是当我想记录并“吃掉”一个错误,同时让其他一切继续,就好像没有错误一样。 "是的,这正是我想要实现的。感谢您的回复
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-06-14
  • 2019-10-27
  • 2017-02-02
  • 1970-01-01
  • 2019-08-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多