2017-08-10 3 views
1

ich einen Dienst mit einer Funktion vom Typ habenWarum erste() rxjs halten Operator Array Rückkehr

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

Als ich das nenne ich immer nur das erste Element in der INTsummary[] wollen, also bin ich versuchen rxjs first Operator zu verwenden, um dies zu tun:

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)}`) 
    }) 
    } 

von docs und Stackoverflow zu lesen, das ein Objekt zurückgeben sollte, sondern eine Reihe von INTsummary ‚s ich zurück. Wie kann ich nur das erste Objekt im INTsummary[] Array zurückgeben?

+1

'Observable.first' gibt Ihnen den ersten Wert des * streams * der Werte, nicht des * array *, das einer dieser Werte ist. Sie müssen das in einer 'Observable.map' machen, wo Sie dieses Array haben ->' this.myService.getSummary (...). Map (arr => arr [0]) ... '. – jonrsharpe

Antwort

3

first() die Rückkehr der f erste Emission für ein Observable. Wenn Sie also eine Quelle haben, die Arrays wie INTsummary[] ausstrahlt, dann braucht es das erste Array, das es aussendet (nicht das erste Element im Array).

Aus Ihrer Beschreibung möchten Sie das erste Element in dem Array erhalten, so dort sind es zwei Möglichkeiten:

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

... oder wenn Sie wollen wirklich die first() Operator verwenden:

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

das erste funktioniert, aber wenn '.first()', wie Sie erwähnen, ich bekomme Typ Fehler 'ersten gibt es nicht auf Typ INTsummary []' –

+0

Sie sind nur nicht richtig, '.first()' ist ein Methode von 'Observable' und' .concatAll() 'gibt ein Observable zurück, so dass das Problem irgendwo in Ihrem Code liegt. – martin

+0

Ich habe eine Frage, wie ist concatall besser dann mergeall? –

1

Richtig, aber das Objekt zurückgegeben wird, ist ein Array, das, was diese Art heißt es:

Observable<INTsummary[]> 

Wenn es klar Objekte zurückgegeben, würden Sie haben:

Observable<INTsummary> 

Sie mergeMap Operator verwenden können abflachen des Arrays:

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