Redux异步操作:将初始分发放入try块有什么区别吗?

问题描述

考虑一下,我正在使用redux异步操作进行通用的api调用。关于结果,有"INIT"个调度,有"SUCCESS""FAILURE"

"INIT"分派放入try catch块有什么区别吗?

选项A (在try catch块之外):

export const doSomething = data => async dispatch => {
  dispatch(doSomethingInit()) // <-- outside try block
  try {
    let response = await client.get("/api")
    if (response) {
      dispatch(doSomethingSuccess(response.data))
    }
  } catch (error) {
    dispatch(doSomethingFailure(error))
  }
}

选项B (在try catch块中):

export const doSomething = data => async dispatch => {
  try {
    dispatch(doSomethingInit()) // <-- inside the try block
    let response = await client.get("/api")
    if (response) {
      dispatch(doSomethingSuccess(response.data))
    }
  } catch (error) {
    dispatch(doSomethingFailure(error))
  }
}

我会说这只是一个微不足道的细节,但是几乎每当我编写一个新的异步动作时,我都会花一点时间来思考……:/

解决方法

我通常会避免认为事情不会throw

如果抛出该怎么办?用什么代码处理呢?您可能有一个外部try-catch块,但是现在doSomething期间发生的某些事情正在其他地方处理。

我认为,由于您的功能/特性正在“尝试”到doSomething,因此它应该负责尝试捕获生命周期。即使从理论上讲,即使在那时也不会发生。

所以我通常选择选项B

export const doSomething = data => async dispatch => {
  try {
    dispatch(doSomethingInit()) // <-- inside the try block
    let response = await client.get("/api")
    if (response) {
      dispatch(doSomethingSuccess(response.data))
    }
  } catch (error) {
    console.error(error);                   // YOU MIGHT LOG IT HERE
    dispatch(doSomethingFailure(error))
  }
}

我还认为,try-catch块中的所有内容都能使代码更好地读取。