Redux Toolkit 额外的减速器如何有条件地执行?
How Redux Toolkit extra reducers execute conditionally?
使用 redux-toolkit 一切正常。但即使在获取数据时出现错误 dismissAll
操作仍然有效,我无法阻止它执行。
import { createEntityAdapter, createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import firebaseService from 'app/services/firebaseService';
export const dismissAll = createAsyncThunk('notificationPanel/data/dismissAll', async (params, { getState }) => {
const { user } = getState().auth;
try {
await firebaseService.realtimeDB.ref(`notifications/${user.uid}/alerts`).remove();
return true;
} catch (error) {
console.log(error);
}
});
const notificationsAdapter = createEntityAdapter({});
const initialState = notificationsAdapter.getInitialState();
export const {
selectAll: selectNotifications,
selectById: selectNotificationsById
} = notificationsAdapter.getSelectors(state => state.notificationPanel.data);
const dataSlice = createSlice({
name: 'notificationPanel/data',
initialState,
reducers: {
addNotification: (state, action) => notificationsAdapter.addOne(state, action.payload)
},
extraReducers: {
[getNotifications.fulfilled]: (state, action) => notificationsAdapter.addMany(state, action.payload),
[dismissItem.fulfilled]: (state, action) => notificationsAdapter.removeOne,
[dismissAll.fulfilled]: (state, action) => notificationsAdapter.removeAll
}
});
我试过类似的方法:
[dismissAll.fulfilled]: (state, action) => {
if (action.payload === true) notificationsAdapter.removeAll
}
但它 returns 错误使用。
如何有条件地执行它?
如果有错误,如果你已经处理了它,createAsyncThunk
将不会拾取它 - 因为从 createAsyncThunk
的角度来看,没有错误。
要么删除 try..catch
包装,要么在 catch
块中删除 throw error
以重新引发错误。在这种情况下,cAT
将停止发送已完成的操作,转而发送被拒绝的操作。
使用 redux-toolkit 一切正常。但即使在获取数据时出现错误 dismissAll
操作仍然有效,我无法阻止它执行。
import { createEntityAdapter, createAsyncThunk, createSlice } from '@reduxjs/toolkit';
import firebaseService from 'app/services/firebaseService';
export const dismissAll = createAsyncThunk('notificationPanel/data/dismissAll', async (params, { getState }) => {
const { user } = getState().auth;
try {
await firebaseService.realtimeDB.ref(`notifications/${user.uid}/alerts`).remove();
return true;
} catch (error) {
console.log(error);
}
});
const notificationsAdapter = createEntityAdapter({});
const initialState = notificationsAdapter.getInitialState();
export const {
selectAll: selectNotifications,
selectById: selectNotificationsById
} = notificationsAdapter.getSelectors(state => state.notificationPanel.data);
const dataSlice = createSlice({
name: 'notificationPanel/data',
initialState,
reducers: {
addNotification: (state, action) => notificationsAdapter.addOne(state, action.payload)
},
extraReducers: {
[getNotifications.fulfilled]: (state, action) => notificationsAdapter.addMany(state, action.payload),
[dismissItem.fulfilled]: (state, action) => notificationsAdapter.removeOne,
[dismissAll.fulfilled]: (state, action) => notificationsAdapter.removeAll
}
});
我试过类似的方法:
[dismissAll.fulfilled]: (state, action) => {
if (action.payload === true) notificationsAdapter.removeAll
}
但它 returns 错误使用。
如何有条件地执行它?
如果有错误,如果你已经处理了它,createAsyncThunk
将不会拾取它 - 因为从 createAsyncThunk
的角度来看,没有错误。
要么删除 try..catch
包装,要么在 catch
块中删除 throw error
以重新引发错误。在这种情况下,cAT
将停止发送已完成的操作,转而发送被拒绝的操作。