JS异步/等待:捕获调用方而不是尝试/捕获?

时间:2018-09-08 01:59:15

标签: javascript async-await

异步/等待肯定使我的代码更整洁,更干燥。对于错误处理,我不确定最佳实践。我发现的大多数示例在try函数中都有一个catch / async。如果呼叫者有一个.catch(),您是否必须拥有它?与下面的Example1相比,Example2有什么优势?

Example1 尝试/捕获异步功能:

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 */
}

Example2 with 尝试/捕获异步功能:

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 个答案:

答案 0 :(得分:0)

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

在示例2中,您还有其他好处,如果您获得发生错误的确切位置,则在引发错误之前对其进行记录可能很有用。在函数saveReminder之后的代码中,promise末尾的捕获将捕获任何未处理的异常,而与它发生在哪个promise链无关。