Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/417.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 在Redux中具有依赖关系的多个操作可观察_Javascript_React Redux_Rxjs5_Redux Observable - Fatal编程技术网

Javascript 在Redux中具有依赖关系的多个操作可观察

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}

我正在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} 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操作。