Redux-Observable中具有依赖项的多个操作

时间:2018-02-12 22:49:56

标签: javascript react-redux rxjs5 redux-observable

我在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函数来执行此操作,但还有其他更简单的方法吗?

1 个答案:

答案 0 :(得分:1)

  

为简化问题,我只想在异步之前发出SECOND_ACTION。

要在执行fetchAsync之前发出其他操作,您可以使用Observable.concatstartWith运算符,这对于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 }
             )
          }) 
    })
 };

如果这不是你的意思,我道歉。问题不明确。