2017-08-30 790 views
1

我的要求是,我有两个端点一个列出HondaCars和一个列表PeugoetCars当我使用combineLatest运算符时,它不会等待另一个流完成;rxjs发出并行请求并等待两个完成并更新后,其中一个发出

这里我的要求=>第一次等待,直到两个源流两者的一个后收到的值那么刷新后接收的值

编辑

所以经过搜索的一段时间,我只是贴有combineLatest但诀窍是在这里:

this.loading = Observable.combineLatest(
    myFirstObservableIndicatingIfFirstHttpReqEnded, 
    mySecondObservableIndicatingIfSecondHttpReqEnded 
).map(d => d.some(t => t === true)); 

所以现在,用户只要看到微调,直到所有请求已完成,即使两者的一个可观测量一个已经取得了一定的价值。

只是为了澄清我有两个loadingReducers这是处理加载逻辑对于每个可测量,所以在我的情况下,我这样做是为了知道当两个HTTP调用完成

+0

完全有观测一个非常特殊的意义。大理石图可以让你的情况更清晰。无论如何,它听起来像你想要的其实是'combineLatest':“为了确保输出数组的长度始终相同,'combineLatest'实际上会等待所有输入的可观察对象至少发出一次” – cartant

+0

你能否用什么来更新你的问题你已经试过了? –

+0

@ Jota.Toledo好吧,我会更新我的问题与我所做的 –

回答

1

首先,您需要使用Observable.forkJoin(),然后用.switchMap()切换你可观察到Observable.combineLatest()

let combined = Observable 
    .forkJoin([myFirstObservableIndicatingIfFirstHttpReqEnded, mySecondObservableIndicatingIfSecondHttpReqEnded]) 
    .switchMap(joinedResults => { 
     console.log('forkJoined results!', joinedResults); 
     this.hasReqEnded = joinedResults.some(t => t === true); 
     return Observable.combineLatest(joinedResults) 
    }); 

combined.subscribe(d => this.hasReqEnded = d.some(t => t === true)); 

this.hasReqEnded就是我创造了一些虚拟变量。诀窍是你需要写两次this.hasReqEnded的值:一次在switchMap(在forkJoin之后),另一个在订阅,即在Observable.combineLastest()之后。

或者,您可以有两个观察对象:一个是forkJoin,另一个是combineLatest(),您可以订阅两个观察对象并相应地更新您的变量。

这里有一个working JSBin

0

HTTP调用是有限的流:它发出的价值和完成。 所以,第一部分:“第一次的等待,直到两个源流收到价值”

const initial$ = Rx.Observable.forkJoin(
    this.httpService1.get(), 
    this.httpService2.get() 
); 

第二部分:“那后刷新后两者的一个接收值”。

我们需要改变一些无限流(一些用户操作,例如)以流“HondaCars”或“PeugoetCars”的,它可以通过“.switchMap”来完成:

const stream1$ = someUserAction1$ 
    .switchMap(()=>this.httpService1.get()); 

所以,如果我们希望有< [HondaCars,PeugoetCars]立即经过一番动作发出>流:

Rx.Observable.combineLatest(
    someUserAction1$ 
     .startWith(null) // we need to make initial call, but we have no user action yet, fix it) 
     .switchMap(()=>this.httpService2.get())$, 

    someUserAction2$ 
     .startWith(null) 
     .switchMap(()=>this.httpService2.get())$ 
); 
相关问题