我想调用两个观测值,第二个在Angular2中第一个之后调用

我想调用两个观测值,第二个在Angular2中第一个之后调用,angular,rxjs,observable,angular2-observables,Angular,Rxjs,Observable,Angular2 Observables,我想调用两个观测值,第二个在第一个之后调用 我有一个可以观察到的,也是先订阅的。 然后,我希望第二个可观察对象嵌套在第一个可观察对象中 我想将下面这两个订阅组合起来: this.serviceA.getData() .takeUntil(destroyed$) .subscribe(item => { }); this.serviceB.getData() .takeUntil(destroyed$) .subscribe(item => { }); 这是我的尝试,显示了我想

我想调用两个观测值,第二个在第一个之后调用

我有一个可以观察到的,也是先订阅的。 然后,我希望第二个可观察对象嵌套在第一个可观察对象中

我想将下面这两个订阅组合起来:

this.serviceA.getData()
.takeUntil(destroyed$)
.subscribe(item => {

});

this.serviceB.getData()
.takeUntil(destroyed$)
.subscribe(item => {

});
这是我的尝试,显示了我想做什么(更新)

destrocted$:Subject=newsubject();
ngOnInit():void{
this.serviceA.getData
.takeUntil(此.destromed$)
.concatMap(dataA=>{
this.myDataA=dataA;
返回this.serviceB.getData;
})
.takeUntil(此.destromed$)
.subscribe(数据=>{
this.myDataA.forEach(item=>{
item.visible=dataB.find(o=>o.id==item.label);
}); 
});
};
ngOnDestroy():void{
此.next(true)已销毁$;
此.complete$.complete();
};
目的是在第一次订阅之后调用嵌套订阅,因为第二次订阅中需要来自第一个订阅的数据

您需要使用
forkJoin

并行运行所有可观察序列并收集其最后的元素

例如:

let character=this.http.get('https://swapi.co/api/people/1.map(res=>res.json());
让characterHomeworld=this.http.get('http://swapi.co/api/planets/1.map(res=>res.json());
Observable.forkJoin([character,characterHomeworld])。订阅(结果=>{
//结果[0]是我们的特色
//结果[1]是我们的性格家园
结果[0]。家庭世界=结果[1];
this.loadedCharacter=结果[0];

});接受的答案不正确。
forkJoin
将同时订阅两个观测值,同时您要首先订阅第一个观测值,并在它完成后订阅第二个观测值

这通常使用以下运算符完成:

this.serviceA.getData()
  .concatMap(response => this.serviceB.getData())
  .subscribe(...)
如果要组合这两个响应,可以使用
map
after
serviceB.getData()


为什么不在RxJS上使用flatMap?如何知道第一个可观察到的总是只需要一秒钟就可以完成?第一个调用是获取全局数据。第二个调用是在屏幕上显示和隐藏数据我认为在这种情况下使用forkJoin会更好?谢谢你的forkJoin,我会尝试一下。上面例子中的一个旁注是他们在this.items上使用foreach操作符而不是普通的js foreach,你能解释一下你的问题吗?嗨,不,我的意思是,在第一个订阅响应中,我想在this.items上循环使用foreach,然后使用第二个订阅响应更新this.items的foreach中的一个字段。Shi martin,感谢您的回答。我已经更新了我在问题中的尝试。“你能看一看,看看是否正确吗?”马丁:你读了我的完整答案了吗?OP想要合并两个观测值,然后更新问题以获得一个又一个的特定数据,我认为
concatMap
在这方面是无用的situation@Microsmsm即使在更新了问题之后,您仍然是错的,
forkJoin
也不会做OP想要做的事情。在我的回答中,第二个数据依赖于第一个数据,我错过了什么吗?@MSM是的,你错过了。它不起作用:)继续,试着自己在plnkr/jsbin中运行第二个示例。
this.serviceA.getData()
  .concatMap(response => this.serviceB.getData())
  .subscribe(...)
this.serviceA.getData()
  .concatMap(responseA => this.serviceB.getData()
    .map(responseB => /* combine responseA and responseB */ ))
  .subscribe(...)