我在React& amp;中使用了Redux-Observable Epic。 Redux项目。我需要发出多个动作,原来这就是我一直在做的,
1)在Epic中抓住START_ACTION
2)获取远程数据
3)返回一个新的Observanble
例如:
import fetch from 'isomorphic-fetch';
import {Observable} from 'rxjs/Observable';
import {switchMap} from 'rxjs/operator/switchMap';
import {mergeMap} from 'rxjs/operator/mergeMap';
const fetchAsync = (arg) => {
// return an observable of promise
return Observable::from(fetch(url + arg));
}
export function myEpic = (action$) => {
action$.ofType(START_ACTION)
::switchMap(action => {
return fetchAsync('/action.payload')
::mergeMap(result => {
return Observable::of({type: ACTION_COMPLETE, payload: result})
})
})
};
现在,如果我需要在SECOND_ACTION
之后和START_ACTION
之前发出其他操作ACTION_COMPLETE
,该怎么办?换句话说,如果不确保SECOND_ACTION
命中减速器,则不应发出ACTION_COMPLETE
。
我可以编写另一个单独的Epic函数来执行此操作,但还有其他更简单的方法吗?
答案 0 :(得分:1)
为简化问题,我只想在异步之前发出SECOND_ACTION。
要在执行fetchAsync
之前发出其他操作,您可以使用Observable.concat
或startWith
运算符,这对于concat来说基本上是糖。
export function myEpic = (action$) => {
action$.ofType(START_ACTION)
::switchMap(action => {
return fetchAsync('/action.payload')
::map(result => ({ type: ACTION_COMPLETE, payload: result })
::startWith({ type: SECOND_ACTION })
})
};
由于SECOND_ACTION
同步跟随START_ACTION
,请注意,通常您应该让缩减器监听START_ACTION
而不是发出其他操作。多个reducers转换状态来自同一个动作是正常的,也是redux的主要好处之一。
尽管如此,有时候关注点的分离更为理想,所以这更像是一般性提示。
如果要按顺序发出两个动作,可以将其他动作作为参数传递给Observable.of(...actions)
,因为它接受任意数量的参数并按顺序发出它们。
export function myEpic = (action$) => {
action$.ofType(START_ACTION)
::switchMap(action => {
return fetchAsync('/action.payload')
::mergeMap(result => {
return Observable::of(
{ type: SECOND_ACTION },
{ type: ACTION_COMPLETE, payload: result }
)
})
})
};
如果这不是你的意思,我道歉。问题不明确。