问题描述
考虑一下,我正在使用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
块中的所有内容都能使代码更好地读取。