2016-05-11 4 views
2

が動作していません印刷のみ最初のオブジェクトRxjs5は、()これは、コードで

_

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

何コードが返されていますか?それらがすべて同じコードであれば、それは期待される動作です... – paulpdaniels

+0

@paulpdaniels 4小道具(緯度、経度、サイズ、コード)を持つ1obj私はJSONPリクエストから来た最初のものだと思います! 別名を削除すると多くのオブジェクトが返され、それらはすべて互いに異なるものです... 何が問題なのですか。 – Focus

答えて

1

あなた(と私最初は).distinct()オペレータがどのように動作するかの同じ間違った理解していました。あなたが実際にブール値を返す比較演算機能を渡す必要があります:

例:

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

あなたのケースでは、あなたは合格する必要があります:

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

提供機能の説明に基づいて、 reactx.ioによって、私の理解は.distinct()オペレータがあなたがコード化した方法(実際にはこれがバグかどうか、私は確信していません)を動作させるべきです。

しかし、あなたのコードとしては動作しません(私もそれをテストしました)、別のオプションはを使用して.distinct()を呼び出す前に値を引き出すことです。私のテストでは、これは期待通りに機能します(.distinct()コールに引数を与えないでください)。あなたのコードに基づいて

例:

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