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

在async/await的mergeMap中派发多Redux Action遇报错求助

解决redux-observable中async/await返回多个action的报错问题

错误原因

你遇到的Actions must be plain objects. Instead, the actual type was: 'array'报错,核心问题在于redux-observable的Epic必须返回Observable<Action>类型,不能直接写成async函数。async函数返回的是Promise,哪怕你用of()或from()包裹action数组,最终返回的是Promise<Observable>,redux-observable会把整个Observable当成"action"发射,或是把数组作为单个值传递,自然不符合action必须是纯对象的要求。

正确写法(保留async/await+try/catch)

不需要把整个Epic写成async函数,而是在Epic的管道操作符(比如mergeMap/switchMap)的投影函数里使用async/await,完成Promise等待后用from()将action数组转换成Observable,让mergeMap自动展开这个Observable,逐个发射action对象。

示例代码:

import { ofType } from 'redux-observable';
import { mergeMap, from, of } from 'rxjs';

// 示例异步操作函数
const fetchData1 = () => Promise.resolve('data1');
const fetchData2 = () => Promise.resolve('data2');

const myEpic = (action$, state$) => action$.pipe(
  ofType('TRIGGER_ACTION'), // 触发Epic的action类型
  mergeMap(async () => {
    try {
      // 等待多个Promise完成
      const [data1, data2] = await Promise.all([fetchData1(), fetchData2()]);
      
      // 用from()将action数组转为Observable,逐个发射action
      return from([
        { type: 'SUCCESS_ACTION_1', payload: data1 },
        { type: 'SUCCESS_ACTION_2', payload: data2 }
      ]);
    } catch (error) {
      // 错误处理,返回单个错误action
      return of({ type: 'FAIL_ACTION', payload: error.message });
    }
  })
);

关键说明

  • mergeMap会自动将投影函数返回的Observable展开,把里面的每个action单独发射,确保redux-observable接收的都是纯对象action。
  • 这种写法完美保留了async/await的异步语法和try/catch的错误处理逻辑,同时符合Epic的返回值要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 12:52:32