2016-10-28 61 views
0

我有以下代碼:角2 - 運行2訂閱的同時

//Subscription 3: role ID to role Name 
     af.database.object('/roles/'+businessRole.$value) 
     .subscribe((roleData) => { 
     //Subscription 4: Get user info 
     af.database.object('/users/'+businessRole.$key).subscribe(user => { 

其中包含一個訂閱內的預訂。

這裏的問題是,在運行第二個應用程序之前,應用程序正在等待第一個應用程序。我想一次執行它們兩個,並獲得每個的結果。我該怎麼做?

我一直在使用之前Promise.All()但:

  1. 我很想知道我該怎麼做,與rxjs
  2. 我無法找到一個辦法讓每個觀察到的使用Promise.All()的結果

感謝

回答

1

這會創建兩個在1000ms和900ms之後完成的觀測值。當你運行這個演示程序時,你會看到第一個完成了第一個演示之後的一瞬間,證明這些演示是並行執行的。

let obs1 = Observable.of('HTTP Response 1').delay(1000); 
let obs2 = Observable.of('HTTP Response 2').delay(900); 

console.log('Start'); 

obs1.merge(obs2) 
    .subscribe(val => console.log(val), undefined,() => console.log('Completed')); 

見現場演示:http://plnkr.co/edit/hzmpclxDkIhnfTYcWXd5?p=preview

這將打印到控制檯:

Start 
HTTP Response 2 
HTTP Response 1 
Completed 

如果需要forkJoin(),然後看到我以前的答案Observable.forkJoin() doesn't executes :)。

+0

如何獲得每個可觀察數據的輸出? 'val'是每個可觀察輸出的數組? – TheUnreal

+0

@TheUnreal'merge()'操作符發出它作爲參數獲得的所有Observables的值,因此將爲每個響應調用'.subscribe()'中的回調。 – martin

+0

這是一個問題,因爲我需要獲取和使用每個輸出,並且使用這種「合併」方法,我無法確定哪些可觀察的重新輸出每個輸出,我錯了嗎?例如,我需要在'user'變量中存儲第一個observables數據,並在第二個變量中存儲'role'變量。 – TheUnreal

4

我相信Observable.forkJoin正是您需要使用您的情況是什麼。

這是你的代碼將如何看起來像使用forkJoin:

Observable.forkJoin(
this.http.get('/roles/'+businessRole.$value).map((response: Response) => res.json()), 
this.http.get('/users/'+businessRole.$key).map((response: Response) => res.json()) 
).subscribe(data => { 
    data[0] // this will contain roleData 
    data[1] // this will contain user 
}, 
error => console.log(error)); 

This是一個有用的鏈接,您可以瞭解更多有關觀測以及如何使用forkJoin。

+0

嗯,我在我以前的帖子中嘗試過,http://stackoverflow.com/questions/40303012/observable-forkjoin-doesnt-executes – TheUnreal

+0

好的答案:) –