我正在尝试将多个操作分派给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.
答案 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' },
)),