从redux-observable中调度多个动作

时间:2019-06-21 10:03:47

标签: 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
          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 Error: Actions must be plain objects. Use custom middleware for async actions.

1 个答案:

答案 0 :(得分:1)

map只是将一项映射到另一项,因此当您返回[action1, action2]时,您仍在返回一个数组,并且redux-observable试图将其视为动作本身。相反,您想要的是“解包”返回的数组(或使用concat创建的Observable)。

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

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

如果这看起来太奇怪了,则可以用from包装该数组以使其更加明显:

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

您甚至可以使用一个of

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