如何使用React,Redux和Redux-Saga实现乐观状态更新/推送

时间:2017-10-20 13:58:50

标签: reactjs redux redux-saga

我正在尝试实现乐观状态更新,因此我立即在更新操作时更新状态,然后执行撤消&如果更新请求失败,请通知用户。

我有跟随工人和观察者的传奇:

// 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块中使用之前更新。

1 个答案:

答案 0 :(得分:2)

两种解决方案:

  1. 将currentState的深层副本传递给操作有效负载(有点慢)
  2. 在你的减速器中保留一个名为prevState的第二个字段,并将当前状态所需的道具分配给它,然后在你的传奇中使用它