页面内发起多次dispatch调用时,这样的错误处理方式是否正确?
问题解答
现有错误处理的合理性
你当前的错误处理逻辑是正确的。fetchProductC的catch分支中已经完成了对应状态重置、错误打印的降级处理,且你注释掉了throw err语句,这一步已经避免了异常向上抛出:此时fetchProductC返回的Promise状态为resolved,外层await不会触发全局catch,后续的productD、productE的dispatch调用不会被中断,可以正常执行。
如果你取消throw err的注释,异常会逐层向上传递到外层的try/catch块,才会导致后续逻辑终止。
通用兼容方案
如果希望所有接口的报错都不会阻塞后续请求执行,不需要依赖每个请求内部是否抛出异常,可以采用以下两种方案:
单个请求独立捕获异常
给每个await的dispatch单独包裹try/catch,和全局异常逻辑隔离:
useEffect(() => { async function getStorageData() { setLoading(true); try { await dispatch(fetchProductA()); } catch (err) { console.log('fetchProductA error', err); } try { await dispatch(fetchProductB()); } catch (err) { console.log('fetchProductB error', err); } try { await dispatch(fetchProductC()); } catch (err) { console.log('fetchProductC error', err); } try { await dispatch(fetchProductD()); } catch (err) { console.log('fetchProductD error', err); } try { await dispatch(fetchProductE()); } catch (err) { console.log('fetchProductE error', err); } setLoading(false); } getStorageData(); }, []);
并行请求优化(无先后依赖时推荐)
如果多个接口没有先后调用的依赖关系,不需要等待前一个返回再发起下一个请求,可以用Promise.allSettled并行发起所有请求,执行效率更高,且天然支持单个请求失败不影响其他请求的处理:
useEffect(() => { async function getStorageData() { setLoading(true); // 同时发起所有请求 const requestList = [ dispatch(fetchProductA()), dispatch(fetchProductB()), dispatch(fetchProductC()), dispatch(fetchProductD()), dispatch(fetchProductE()) ]; // 等待所有请求完成,无论成功失败 const resultList = await Promise.allSettled(requestList); // 可选:遍历处理每个请求的返回结果 resultList.forEach((result, index) => { if (result.status === 'rejected') { console.log(`第${index + 1}个产品接口请求失败`, result.reason); } }); setLoading(false); } getStorageData(); }, []);
内容的提问来源于stack exchange,提问作者Kerry
相关产品推荐
相关产品推荐

