Javascript 在Redux中具有依赖关系的多个操作可观察
我正在React&Redux项目中使用Redux Observable Epic。我需要发出多个动作,本来这就是我一直在做的 1捕捉史诗中的开始动作 2获取远程数据 3返回一个新的可观察对象 例如:Javascript 在Redux中具有依赖关系的多个操作可观察,javascript,react-redux,rxjs5,redux-observable,Javascript,React Redux,Rxjs5,Redux Observable,我正在React&Redux项目中使用Redux Observable Epic。我需要发出多个动作,本来这就是我一直在做的 1捕捉史诗中的开始动作 2获取远程数据 3返回一个新的可观察对象 例如: import fetch from 'isomorphic-fetch'; import {Observable} from 'rxjs/Observable'; import {switchMap} from 'rxjs/operator/switchMap'; import {mergeMap}
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})
})
})
};
现在,如果我有另一个动作,在开始动作之后和动作完成之前,需要发出第二个动作,该怎么办?换句话说,如果不确保第二个动作击中减速器,则不应发出动作完成
我可以编写另一个单独的Epic函数来实现这一点,但还有其他更简单的方法吗
为了简化问题,我只想在异步之前发出第二个_动作 要在执行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 })
})
};
因为第二个动作同步地跟在开始动作之后,所以请记住,通常您应该让还原程序侦听开始动作,而不是发出另一个动作。多个还原程序从同一个操作转换状态是正常的,这也是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 }
)
})
})
};
如果这不是你的意思,我道歉。问题还不清楚。当操作等待第二个操作时,完成操作会发生什么情况?如果它永远不会出现呢?或者你是说你想让这部史诗片发出第二个动作,然后紧接着是动作完成?i、 e.发出两个动作我想发出第一个动作,然后紧接着是第二个动作。我正在考虑在返回第一个动作的动作函数中使用dispatchSECOND动作第一个动作来自哪里?这不是你上面的问题。你的意思是行动完成了吗?谢谢你的回答,为不清楚的问题道歉。第一个动作来自动作文件,由用户触发。例如,您可以将其想象为单击表单中的submit按钮所导致的操作。这将向reducer发出一个操作来更新状态,表示嘿,我正在异步地向数据库提交一些东西。React将根据状态更改显示加载微调器。为了简化问题,我只想在异步之前发出第二个\u操作。