You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Redux createListenerMiddleware监听asyncThunk的fulfilled动作?

能否用Redux的createListenerMiddleware监听createAsyncThunk的fulfilled动作?

完全可行。createAsyncThunk会自动生成pending、fulfilled、rejected三种标准Redux action类型,这些动作和你用createSlice定义的同步action一样,都能被createListenerMiddleware监听。

具体实现示例

1. Slice中定义异步Thunk(示例代码)

// MyAction-slice.ts
import { createAsyncThunk, createSlice } from '@reduxjs/toolkit';

// 定义异步Thunk
export const myAsyncAction = createAsyncThunk(
  'mySlice/myAsyncAction',
  async (payload: any) => {
    // 这里写异步逻辑,比如API请求
    const res = await fetch('/api/target-data');
    return res.json();
  }
);

const mySlice = createSlice({
  name: 'mySlice',
  initialState: { data: null, loading: false },
  reducers: {
    // 同步action
    myAction: (state) => {
      // 同步状态更新逻辑
    }
  },
  extraReducers: (builder) => {
    builder
      .addCase(myAsyncAction.fulfilled, (state, action) => {
        state.data = action.payload;
        state.loading = false;
      })
      .addCase(myAsyncAction.pending, (state) => {
        state.loading = true;
      });
  }
});

export const { myAction } = mySlice.actions;
export default mySlice.reducer;

2. 在Store中监听fulfilled动作

// store.ts
import { configureStore, createListenerMiddleware } from '@reduxjs/toolkit';
import myReducer from './MyAction-slice';
import { myAsyncAction, myAction } from './MyAction-slice';

const listenerMiddleware = createListenerMiddleware();

// 监听异步action的fulfilled状态
listenerMiddleware.startListening({
  actionCreator: myAsyncAction.fulfilled,
  effect: async (action, listenerApi) => {
    // 这里写监听触发后的逻辑,比如打印结果、触发其他action等
    console.log('异步操作完成,返回数据:', action.payload);
    // 示例:触发其他同步action
    // listenerApi.dispatch(myAction());
  }
});

// 原来的同步action监听逻辑
listenerMiddleware.startListening({
  actionCreator: myAction,
  effect: (action) => {
    console.log('同步action触发');
  }
});

export const store = configureStore({
  reducer: {
    mySlice: myReducer
  },
  middleware: (getDefaultMiddleware) =>
    getDefaultMiddleware().prepend(listenerMiddleware.middleware)
});

注意点

  • 确保正确导入myAsyncAction,并使用其.fulfilled属性作为actionCreator传入startListening,这样就能精准捕获异步操作完成的动作。
  • 监听的effect函数支持异步逻辑,你可以在这里执行任何后续操作,比如调用其他服务、触发额外的Redux action等。

内容的提问来源于stack exchange,提问作者armaka

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.03 09:00:14