2017-08-10 120 views
1

我有爲什麼第一(做)rxjs運營商回頭率陣列

getSummary(id: string, universe: string): Observable<INTsummary[]>

當我把這叫做我只希望在INTsummary[]的第一個項目類型的功能的服務,所以我試圖用rxjs first運營商要做到這一點:

loadQuickSummary(){ 
    var obj = this.myService.getSummary(this.user.id, this.user.universe).first(); 
    console.log("getting quick summary"); 
    obj.subscribe(r => { 
     console.log(`first value ${JSON.stringify(r)}`) 
    }) 
    } 

從閱讀文檔和計算器,這應該返回一個對象,而是我回來的INTsummary的數組。

如何才能找回INTsummary[]陣列中的第一個對象?

+1

'Observable.first'爲您提供* stream *值的第一個值,而不是* array *的第一個值,這是其中一個值。你需要在一個'Observable.map'裏面做這件事,在那裏你有這個數組 - >'this.myService.getSummary(...)。map(arr => arr [0])...'。 – jonrsharpe

回答

3

first()返回f首先發射一個Observable。所以,當你有源發出像INTsummary[]這樣的數組時,它會發出第一個數組(不是數組中的第一個數組)。

從你的描述你想要得到的陣列因此是第一項有兩種方式:

this.myService.getSummary(this.user.id, this.user.universe) 
    .map(array => array[0]) 

...或者,如果你真的想使用first()操作:

this.myService.getSummary(this.user.id, this.user.universe) 
    .concatAll() // flatten the array into separate emission 
    .first() 
+0

第一個作品,但是當使用'.first()'作爲你提到的我得到的類型錯誤'首先不存在類型INTsummary []' –

+0

你只是沒有使用它的權利,'.first()'是一個'Observable'和'.concatAll()'方法返回一個Observable,所以問題出現在你的代碼中。 – martin

+0

我有一個問題,如何concatall更好,然後合併? –

1

權,但返回的對象是一個數組,那這是什麼類型的狀態:

Observable<INTsummary[]> 

如果它返回平原的對象,你會:

Observable<INTsummary> 

您可以使用mergeMap運營商展平陣列:

var obj = this.myService.getSummary(this.user.id, this.user.universe).first().mergeMap(r => r);