在可观察的redux中从调度多个操作

在可观察的redux中从调度多个操作,redux,rxjs,redux-observable,Redux,Rxjs,Redux Observable,我正在尝试向redux发送多个操作。这是我的密码 action$.pipe( ofType(trigger), mergeMap(({ payload }) => from(endpoint(payload)).pipe( map(response => // this works fine // setData(response.data) // this doesn't

我正在尝试向redux发送多个操作。这是我的密码

 action$.pipe(
    ofType(trigger),
    mergeMap(({ payload }) =>
      from(endpoint(payload)).pipe(
        map(response =>

          // this works fine
          // setData(response.data)

          // this doesn't
          concat(
            of(setData(response.data)),
            of({ type: 'hello' })
          )

          // I also tried
          [
            of(setData(response.data)),
            of({ type: 'hello' })
          ]

        )
      )
    ),

    catchError(err => Promise.resolve(creators.setError(err)))
  )

单个分派是有效的,但如果我像上面那样尝试多个项目,我会得到
Uncaught错误:操作必须是普通对象。使用自定义中间件进行异步操作。

映射
只是将一个项目映射到另一个项目,因此当您返回
[action1,action2]
时,您仍然返回一个数组,并且
redux observable
尝试将其视为一个操作本身。相反,您需要的是“展开”返回的数组(或使用
concat
创建的可观察数组)

因此,您可以使用
mergeMap
(或
concatMap
)而不是使用
map
),当您返回一个数组时,它将迭代该数组并对每个项目进行单独的发射:

mergeMap(response => [
  setData(response.data),
  { type: 'hello' },
]),
如果这看起来太奇怪,您可以使用
from
将数组包装起来,使其更加明显:

mergeMap(response => from([
  setData(response.data),
  { type: 'hello' },
])),
您甚至可以使用一个

mergeMap(response => of(
  setData(response.data),
  { type: 'hello' },
)),

可能是重复的,非常感谢。我花了一天时间想弄明白
mergeMap
是我所缺少的。在某些情况下,switchMap可以作为替代方案。开关映射(()=>[action1,action2])