0
我從API獲取用戶並將其存儲在我的狀態中,因此我不必再次獲取它。 問題是多個組件同時請求用戶導致多個併發提取請求。Redux sagas當多次發送同一個ID時只讀取一次
是否有避免這種情況的良好模式?
這是我的傳奇
function* watchUserRequests() {
yield takeEvery(actionTypes.USER_REQUESTED, userRequested);
}
function* userRequested(action) {
const {id} = action.payload;
let user = yield select(state => state.users.all[id]);
// cancel if user exists
if (user) return;
user = yield call(userApi.get, id);
yield put(userActions.userLoaded(id, banner));
}
操作
export function userRequested(id) {
return {type: types.USER_REQUESTED, payload: {id}};
}
export function userLoaded(id, user) {
return {type: types.USER_LOADED, payload: {id, user}};
}
爲了避免併發的取指令請求您可以在狀態存儲不僅牽強用戶還有那些正在取出。我可以看到這是不是很漂亮,但想不出一種方法來避免這種情況。你可以寫一些高階函數來至少隔離一些邏輯。 –
謝謝,這是一個好主意。我試圖在userRequested函數開始時分派USER_LOADING操作來存儲這些信息。但是,所有的USER_REQUESTED操作都更快,並且在第一個USER_LOAD操作到達減速器之前就已經開始了。 – Fredrik
您必須更改reducer中userRequested操作的狀態。 –