2017-01-21 5 views
0

私はこの簡単な例で問題を解消しました。リプレイを使わずにRxJsで2つのストリームをマージする

var button1Click$ = Rx.Observable.fromEvent(document.getElementById('button1'),'click') 
         .map(function(){ 
         console.log('Map:all'); 
         return "all" 
         }) 

var odd$ = button1Click$.filter(function(){ 
    return (Date.now() %2 === 1); 
}) 
.map(function(){ 
     console.log('Map:odd'); 
     return "odd" 
    }) 



var combined$ = button1Click$.merge(odd$); 
combined$.subscribe(function(ev){ 
    console.log(ev); 
}); 

Demo: https://jsbin.com/diredeb/edit?js,console,output

Iは、クリックストリームとクリックストリームをフィルタリングすることによって(現在時刻に基づいて)奇数のクリックストリームを作成しています。 今、イベント「all」と「odd」の両方を受け取る単一のストリームが必要です。 この2つのストリームをmergeにマージしています。問題はmergeで、button1Click$で定義されているmapが2回呼び出されています。私がeven$という別のストリームを作成してマージしたとすると、mapが3回呼び出されているとします。デモを確認してください。

mapbutton1Click$に定義されています)がクリックごとに1回だけ呼び出されるようにストリームをマージする方法を教えてください。

答えて

1

だけsharebutton1Clicked$:この作品なぜあなたは

var button1Click$ = Rx.Observable.fromEvent(document.getElementById('button1'),'click') 
        .map(function(){ 
        console.log('Map:all'); 
        return "all" 
        }) 
        .share(); 
+0

説明することができますか? –

+0

'.share()'は複数のサブスクライバ間でストリームを共有するので、ストリーム自体は常に1回だけ実行されますが、すべてのサブスクライバは送信されたデータを受け取ります。 - ここに、(古い)ドキュメントへのリンクがあります。これは基本的にあなたの非常に重要な問題を基本的に説明しています:https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md – olsn

関連する問題