在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
相关产品推荐
相关产品推荐

