实现模式Dan(@gaearon)演示了here,我只想知道在以下场景中让常用操作独立工作的最佳方法:
const commonAction = () => {
return async (dispatch, getState, api) => {
try {
const response = await api.get('/resource');
dispatch(success('SUCCESS', response.data));
} catch(error) {
dispatch(error('ERROR', error));
throw error; //this is the problem
}
}
const combinedAction = () => {
return async (dispatch, getState, api) => {
try {
await dispatch(commonAction());
const otherResponse = await api.get('/otherResource');
dispatch(success('COMBINED_SUCCESS', otherResponse.data));
} catch(error) {
dispatch(error('COMBINED_ERROR', error));
}
}
上述方法的工作原理是,如果其中任何一个失败,由于COMBINED_ERROR
重新抛出错误,将调度commonAction
。但是,如果我想单独使用commonAction
,由于重新抛出,我会得到一个未处理的承诺拒绝错误。
我有一个想法是一个可选的bool isStandAlone = true
来决定是否重新投掷,即
const commonAction = (isStandAlone = true) => {
return async (dispatch, getState, api) => {
try {
const response = await api.get('/resource');
dispatch(success('SUCCESS', response.data));
} catch(error) {
dispatch(error('ERROR', error));
if(!isStandAlone) {
throw error;
}
}
}
然后在combinedAction
我会:
await dispatch(commonAction(false));
这是代码味吗?有没有更好的和/或不同的方法来解决这个问题?