我将 redux-saga
与 takeEvery
一起使用,它允许同时执行多个操作:
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
减速器中获得最新状态?或者是否会出现其中一个减速器读取旧的先前状态的竞争条件,如果是,我该如何防止?