Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/33.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
Angular 将一系列嵌套承诺转换为@Effect_Angular_Rxjs_Ngrx - Fatal编程技术网

Angular 将一系列嵌套承诺转换为@Effect

Angular 将一系列嵌套承诺转换为@Effect,angular,rxjs,ngrx,Angular,Rxjs,Ngrx,有没有办法将一组嵌套的异步承诺转换为@Effect 我有一个使用多个异步http调用的事务,在执行下一步之前,我必须等待结果,任何错误都会中止事务并向用户发送错误消息 我对rxjs还相当陌生,似乎我可以用exhaustMap获得与“承诺…然后”相同的动作,但我不确定如何做到这一点,并捕获过程中的错误 我的目标是将整个事务(当前在服务中)移动到ngrx@Effect。我不确定我是否真的理解您的问题,但似乎您可以使用Promise.all()将承诺集合成一个承诺,然后在@Effects中使用。 首先

有没有办法将一组嵌套的异步承诺转换为@Effect

我有一个使用多个异步http调用的事务,在执行下一步之前,我必须等待结果,任何错误都会中止事务并向用户发送错误消息

我对rxjs还相当陌生,似乎我可以用exhaustMap获得与“承诺…然后”相同的动作,但我不确定如何做到这一点,并捕获过程中的错误


我的目标是将整个事务(当前在服务中)移动到ngrx@Effect。

我不确定我是否真的理解您的问题,但似乎您可以使用
Promise.all()
将承诺集合成一个承诺,然后在@Effects中使用。

首先,我会制作多个效果,每个效果会分派一个新动作。它只是更容易理解,您可以在reduce开发工具中获得一个日志

@Effect()
public makeFirstRequest = this.actions.pipe(
    ofType<InitialAction>(ActionTypes.InitialAction),
    switchMap(action => this.myService.firstRequest(action.param)),
    map(response => new FollowUpAction(response))
);

@Effect()
public makeSecondRequest = this.actions.pipe(
    ofType<FollowUpAction>(ActionTypes.FollowUpAction),
    switchMap(action => this.myService.secondRequest(action.param)),
    map(response => new NextAction(response))
);

// and so on...
@Effect()
public makeFirstRequest=this.actions.pipe(
ofType(ActionTypes.InitialAction),
switchMap(action=>this.myService.firstRequest(action.param)),
映射(响应=>新的后续操作(响应))
);
@效果()
public makeSecondRequest=this.actions.pipe(
ofType(ActionTypes.FollowUpAction),
switchMap(action=>this.myService.secondRequest(action.param)),
映射(响应=>新下一步(响应))
);
//等等。。。
这样,它首先执行
初始操作
并发出请求,一旦请求完成,它就执行
后续操作
。您可以将响应作为下一个操作的参数传递。记住,您不必将响应传递给下一个操作。您可以对响应执行任何您想要的操作,并使用您喜欢的任何参数(或没有参数)分派新操作


我不确定这是否包括在你的问题中,但你需要的是可观察的,而不是承诺。如果您确实使用承诺,您只需使用
rxjs
提供的
from(myPromise)
将其映射为一个可观察对象。

让我们假设
a
b
是可观察对象,然后您可以等待使用该方法重新定义所有可观察对象


美好的让我试试这个解决方案。只是为了帮助你,因为效果在地图上是强大而复杂的(response=>{用“response”做你想做的事;返回将被调度的新动作;})这个解决方案基本上是有效的,但是当我添加if/else条件来生成一个成功动作和另一个错误动作时,我得到了一个无效的效果。您能告诉我,为响应添加条件语句的最佳方式是什么吗
@Effect()public makeFirstRequest=this.actions.pipe(of type(ActionTypes.InitialAction)、switchMap(action=>this.myService.firstRequest(action.param))、map(response=>{if(success){new FollowUpAction(response)}})@FrancescoFortin谢谢你的提示,我会更新我的答案;)@markelc嗯,我也会用同样的方法,它应该会起作用。你确定这两个动作都是动作等的延伸吗?谢谢。我也会调查的,谢谢。我来看看forkJoin。forkJoin似乎并行运行所有可观察对象,但我需要按顺序运行它们。
Rx.Observable.forkJoin([a,b]).subscribe(result=> {
        var resultA = result[0];
        var resultB = result[1];
});