Отправка нескольких действий из-за понижения - PullRequest
1 голос
/ 21 июня 2019

Я пытаюсь отправить несколько действий для редукции. Вот мой код

 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 Ответ

1 голос
/ 21 июня 2019

map просто отображает один элемент на другой, поэтому, когда вы возвращаете [action1, action2], вы все равно возвращаете массив и redux-observable пытается рассматривать его как само действие. Вместо этого вам нужно «развернуть» возвращаемый массив (или Observable, созданный с помощью concat).

Таким образом, вместо использования 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' },
)),
...