redux-observable - 在单个史诗中分派多个 redux 操作
redux-observable - dispatch multiple redux actions in a single epic
我正在寻找在 redux-observable
中间件的单个 Epic 中分派多个 redux 操作的方法。
假设我有关注 Epic。每当 SEARCH
事件发生时,Epic 从后端加载数据并调度 RESULTS_LOADED
操作。
searchEpic = (action$) =>
action$
.ofType('SEARCH')
.mergeMap(
Observable
.fromPromise(searchPromise)
.map((data) => {
return {
type: 'RESULTS_LOADED',
results: data
}
})
)
现在,假设我需要在 searchPromise
解决后派发额外的操作。
这样做的最简单方法似乎是有第二个史诗,它将侦听 RESULTS_LOADED
并调度第二个动作。像这样:
resultsLoadedEpic = (action$) =>
action$
.ofType('RESULTS_LOADED')
.map(({results} => {
return {
type: 'MY_OTHER_ACTION',
results
}
})
在这个简单的示例中,它非常容易。但是当 Epics 增长时,我倾向于发现自己有很多 redux 操作,其唯一目的是触发其他操作。此外,一些 rxjs 代码需要重复。我觉得这有点丑。
所以,我的问题是:有没有办法在单个 Epic 中分派多个 redux 操作?
不要求您制作一对一的 in/out 比例。因此,如果需要,您可以使用 mergeMap
(又名 flatMap
)发出多个操作:
const loaded = (results) => ({type: 'RESULTS_LOADED', results});
const otherAction = (results) => ({type: 'MY_OTHER_ACTION', results});
searchEpic = (action$) =>
action$
.ofType('SEARCH')
.mergeMap(
Observable
.fromPromise(searchPromise)
// Flattens this into two events on every search
.mergeMap((data) => Observable.of(
loaded(data),
otherAction(data))
))
)
请注意,任何接受 Observable 的 Rx 运算符也可以接受 Promise、Array 或 Iterable;消耗它们,就好像它们是溪流一样。所以我们可以使用一个数组来达到同样的效果:
.mergeMap((data) => [loaded(data), otherAction(data)])
您使用哪一个取决于您的个人风格偏好和用例。
或者你可能有三个动作,
API_REQUEST,
API_RUNNING,
API_SUCCESS,
searchEpic = (action$) =>
action$
.ofType('API_REQUEST')
.mergeMap((action) => {
return concat(
of({type: 'API_RUNNING'}),
Observable.fromPromise(searchPromise)
.map((data) => {
return {type: 'API_SUCCESS', data};
}),
);
});
我正在寻找在 redux-observable
中间件的单个 Epic 中分派多个 redux 操作的方法。
假设我有关注 Epic。每当 SEARCH
事件发生时,Epic 从后端加载数据并调度 RESULTS_LOADED
操作。
searchEpic = (action$) =>
action$
.ofType('SEARCH')
.mergeMap(
Observable
.fromPromise(searchPromise)
.map((data) => {
return {
type: 'RESULTS_LOADED',
results: data
}
})
)
现在,假设我需要在 searchPromise
解决后派发额外的操作。
这样做的最简单方法似乎是有第二个史诗,它将侦听 RESULTS_LOADED
并调度第二个动作。像这样:
resultsLoadedEpic = (action$) =>
action$
.ofType('RESULTS_LOADED')
.map(({results} => {
return {
type: 'MY_OTHER_ACTION',
results
}
})
在这个简单的示例中,它非常容易。但是当 Epics 增长时,我倾向于发现自己有很多 redux 操作,其唯一目的是触发其他操作。此外,一些 rxjs 代码需要重复。我觉得这有点丑。
所以,我的问题是:有没有办法在单个 Epic 中分派多个 redux 操作?
不要求您制作一对一的 in/out 比例。因此,如果需要,您可以使用 mergeMap
(又名 flatMap
)发出多个操作:
const loaded = (results) => ({type: 'RESULTS_LOADED', results});
const otherAction = (results) => ({type: 'MY_OTHER_ACTION', results});
searchEpic = (action$) =>
action$
.ofType('SEARCH')
.mergeMap(
Observable
.fromPromise(searchPromise)
// Flattens this into two events on every search
.mergeMap((data) => Observable.of(
loaded(data),
otherAction(data))
))
)
请注意,任何接受 Observable 的 Rx 运算符也可以接受 Promise、Array 或 Iterable;消耗它们,就好像它们是溪流一样。所以我们可以使用一个数组来达到同样的效果:
.mergeMap((data) => [loaded(data), otherAction(data)])
您使用哪一个取决于您的个人风格偏好和用例。
或者你可能有三个动作,
API_REQUEST, API_RUNNING, API_SUCCESS,
searchEpic = (action$) =>
action$
.ofType('API_REQUEST')
.mergeMap((action) => {
return concat(
of({type: 'API_RUNNING'}),
Observable.fromPromise(searchPromise)
.map((data) => {
return {type: 'API_SUCCESS', data};
}),
);
});