javascript - JS 异步/等待 : catch in caller instead of try/catch?

标签 javascript async-await

Async/await 确实让我的代码更干净、更干燥。我不确定错误处理方面的最佳实践。我发现的大多数示例在 async 函数中都有 try/catch 。如果调用者有 .catch() ,您是否必须拥有它?示例2相对于下面的示例1有什么优势?

示例1没有异步函数中的try/catch:

function addReminder(data) {
  /*do some stuff*/
  saveReminder(data)
    .then(/*do some stuff*/
    .catch(error => console.log("Error saving reminder"));
}

async function saveReminder(data) {
  await AsyncStorage.setItem('reminders', JSON.stringify(data));
  /* do some stuff */
}

示例2在异步函数中使用 try/catch:

function addReminder(data) {
  /*do some stuff*/
  saveReminder(data)
    .then(/*do some stuff*/)
    .catch(error => console.log("Error saving reminder"));
}

async function saveReminder(data) {
  try {
    await AsyncStorage.setItem('reminders', JSON.stringify(data));
    /* do some stuff */
  } catch (error) {
    throw new Error(error);
  }
}

最佳答案

要捕获异步函数的异常,需要等待调用。因此,如果您不等待它,则只能使用示例 1 中的选项。但是,如果等待它,您可以使用任一选项。

在示例 2 中,您还有一个额外的好处:如果您获得了错误发生的确切位置,则在引发错误之前将其记录下来会很有用。在函数 saveReminder 之后的代码中,Promise 末尾处的 catch 将捕获任何未处理的异常,无论它发生在哪个 Promise 链上。

关于javascript - JS 异步/等待 : catch in caller instead of try/catch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52231347/

相关文章:

javascript - 如何使用原生 JS 创建脚本的完整副本?

javascript - 将动态内容加载到页面

python - aiohttp.TCPConnector (with limit argument) vs asyncio.Semaphore 用于限制并发连接数

c# - ASPNet Entity Framework 6 - EF6,在同一工作单元中混合异步和同步

javascript - 如何处理 async/await fetch API 中的错误 404

javascript - 单击时会生成新文本框的按钮? - JavaScript

Javascript,数组

javascript - 按 ID 值对 div 数组进行排序

flutter - Flutter-如何在streambuilder中使用await?

c# - 模拟对象上的异步回调不等待