2016-05-11 11 views
2

Dies ist der Code:Rxjs5, distinct() nicht funktioniert

, wenn Sie die do() vor dem distinct() Operator alles injizieren ist

ganz gut funktioniert, aber für einige Gründe, distinct() drucken nur das erste Objekt

_

Rx.Observable 
    .interval(1000) 
    .flatMap(_ => { // JSONP request 
    return Rx.Observable.create(observer => { 
     window.eqfeed_callback = res => { 
     observer.next(res); 
     observer.complete(); 
     }; 

     loadJSONP(QUAKE_URL); 
    }).retry(3); 
    }) 
    .flatMap(res => Rx.Observable.from(res.features)) 
    .map(quake => { 
    return { 
     lat: quake.geometry.coordinates[1], 
     lng: quake.geometry.coordinates[0], 
     size: quake.properties.mag * 10000, 
     code: quake.properties.code 
    }; 
    }) 
    .do(logToConsole) // DEBUG: all objects are logged to the console 
    .distinct(quake => quake.code) // it only log the first object ! 
    .subscribe(logToConsole); 
+0

Was Codes zurückgegeben werden? Wenn sie alle den gleichen Code sind, dann ist das erwartete Verhalten ... – paulpdaniels

+0

@paulpdaniels 1obj mit 4 Requisiten (lat, lng, Größe, Code) Ich denke, es ist der erste, der von unserer JSONP Anfrage kam! Wenn wir distinct löschen, werden viele Objekte zurückgegeben und sie sind alle voneinander verschieden ... was ist los? – Focus

Antwort

1

Sie (und mich zuerst) hatte das gleiche falsches Verständnis davon, wie die .distinct() Operator funktioniert. Sie müssen tatsächlich eine comparer Funktion zu übergeben, die einen Booleschen Wert zurückgibt:

Beispiel:

Observable.from([1,2,3,4]) 
    .distinct((a,b) => a == b)) 
    .toArray() 
    .subscribe(result => 
     { 
      expect(result).to.deep.equal([1,2,3,4]) 
     }); 

In Ihrem Fall würden Sie übergeben müssen:

.distinct((q1,q2) => q1.code == q2.code) 
3

Basierend auf der Funktionsbeschreibung zur Verfügung gestellt von reactivex.io, mein Verständnis ist, dass die .distinct()-Operator in der Tat funktionieren sollte, wie Sie codiert haben (ob dies ein Fehler ist oder nicht, bin ich mir nicht sicher).

Da jedoch Ihr Code nicht funktioniert (wie ich es auch getestet habe), ist eine andere Option, .pluck() zu verwenden, um den Wert vor dem Aufruf .distinct() herauszuziehen. In meinen Tests wird dies nun wie erwartet funktionieren (keine Argumente für den Aufruf .distinct() bereitstellen).

Beispiel basiert auf dem Code:

.do(logToConsole) // DEBUG: all objects are logged to the console 
.pluck("code") 
.distinct() // now works as expected 
.subscribe(logToConsole);`