2017-04-15 57 views
2

我在Angular中構建了一個警戒器,我需要發出兩個不同的HTTP請求,並基於這兩個請求確定是否繼續。我注意到forkJoin是這樣做的正確方法,但我無法讓我的火。無法獲得forkJoin發射

在我的代碼,我有:

this.userService.watchCurrentUser().subscribe(data => { console.log(data) }); 
this.orgService.watchOrg().subscribe(data => { console.log(data) }); 
Observable.forkJoin(
    this.userService.watchCurrentUser(), 
    this.orgService.watchOrg() 
).subscribe(data => { 
    console.log(data); 
}); 

前兩個訂閱後來加入到測試,如果調用實際上開火,他們是;我看到他們的日誌。但我從來沒有看到很多從forkJoin

我導入我的文件的頂部:

import { Observable, BehaviorSubject } from 'rxjs/Rx'; 
import 'rxjs/add/observable/forkJoin'; 

是否有別的我失去了一些東西,以便使用forkJoin

回答

3

Observable.forkJoin()要求所有源Observable發出至少一個項目並完成。

您確定您的源代碼Observables已完成嗎?

如果他們不(並根據​​他們的內部邏輯他們不能)也許你寧願使用zip()combineLatest()

+0

他們都做火;我懷疑這可能是問題所在,這就是爲什麼我將訂閱添加到頂端,並且我看到它們實際上都會發出2個值(我在其他地方也會調用它們)。我最終看到4個日誌(頂部的2個),但沒有一個來自forkJoin本身。這兩個調用都只是HTTP請求的包裝,所以除了我所知,禁止返回所需的時間都應該發出。 – RhoVisions

+0

當我無法自己測試時,我不知道你的代碼應該做什麼,但是如果你確定它們都發出並且你知道你總是隻想要一個項目,你可以用'take(1)'鏈接它們來完成收到第一個值後。 – martin

+0

我面臨的問題是我需要兩個HTTP請求來完成,因爲我需要從兩個數據來確定如何繼續。有更多數據可以幫助我們解決問題嗎?正如我所提到的,它們實際上只是HTTP調用的包裝器,內置了一些緩存。 – RhoVisions

0

在你的情況下,一個警衛,你只需要每個流的一個結果。 因此,應將本:

Observable.forkJoin(
    this.userService.watchCurrentUser().first(), 
    this.orgService.watchOrg().first() 
).map(data => { 
    let permitted: boolean; 
    // check the data you want to. 
    return permitted; 
}); 

在叉上方的代碼組合兩個可觀察的第一結果,並且兩個結果將被映射到一個布爾值。