我正在尝试实现乐观状态更新,因此我立即在更新操作时更新状态,然后执行撤消&如果更新请求失败,请通知用户。
我有跟随工人和观察者的传奇:
// Worker Saga
function* updateItem(action) {
// Update state optimistically
yield put({type: UPDATE_ITEM_OPTIMISTICALLY, payload: action.payload});
try {
const response = yield call(axios.post, `${API_URL}/updateItem`, action.payload);
} catch (e) {
// Undo state push
yield put({type: UNDO_UPDATE_ITEM, payload: action.meta.currentState});
}
}
// Watcher Saga
function* rootSaga() {
yield takeEvery(UPDATE_ITEM, updateItem);
}
我正在传递currentState,所以如果请求失败,我可以回复它。
这种方法的问题是UPDATE_ITEM_OPTIMISTICALLY操作在saga代码之前解析,然后meta.currentState在catch块中使用之前更新。
答案 0 :(得分:2)
两种解决方案: