更新 redux 状态时的竞争条件?

时间:2021-03-01 19:53:41

标签: javascript reactjs redux redux-saga race-condition

我将 redux-sagatakeEvery 一起使用,它允许同时执行多个操作:

export function* watchSaga() {
    yield all([
        takeEvery(actionTypes.FETCH_DATA, fetchDataSaga)
    ])
}

fetchDataSaga 看起来像:

export function* fetchDataSaga(action) {
    yield put(actions.fetchDataStart())
    try {
        const response = yield axios.post(url, body)
        yield put(actions.fetchDataSuccess(response.data))
    } catch (error) {
        yield put(actions.fetchDataFail(error.response.data.error))
    }
}

fetchDataSuccess 中,我正在向我的 redux 状态对象中添加一个新字段(或更新如果存在):

const initialState = {
    myObj: {}
}
...
const fetchDataSuccess = (state, action) => {
    const newKey = action.newKey
    return {
        ...state,
        myObj: {
            ...myObj,
            [newKey]: {
                ...myObj[newKey],
                timestamp: new Date().getTime()
            }
        }
    }
}

所以我同时调用了 saga,比方说 100 次:

yield all([
    call(fetchDataSaga, action[0])
    call(fetchDataSaga, action[1])
    call(fetchDataSaga, action[2])
    ...
    call(fetchDataSaga, action[99])
])

之后 myObj 中应该有 100 个字段。

我的问题是,我是否每次都在 fetchDataSuccess 减速器中获得最新状态?或者是否会出现其中一个减速器读取旧的先前状态的竞争条件,如果是,我该如何防止?

0 个答案:

没有答案
相关问题