2017-01-21 7 views
0

Я пропустил свою проблему на этом простом примере.Объединить два потока в RxJs без повтора

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

Я создал поток щелчков и поток нечетных щелчков (на основе текущего времени) путем фильтрации щелчков потока. Теперь я хочу единственный поток, который получает как «все», так и «нечетные». Итак, я объединять эти два потока с merge. Проблема в том, что merge, map, определенный в button1Click$, вызывается дважды. Предположим, что если я создаю другой поток с именем even$ и слейте его, то map получает трижды. Проверьте демонстрационную версию.

Как слить потоки так, чтобы map (определенный для button1Click$) вызывается только один раз за клик.

ответ

1

Просто sharebutton1Clicked$:

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

вы можете объяснить, почему это работает? –

+0

'.share()' разделяет поток между несколькими подписчиками, поэтому сам поток всегда выполняется один раз, но все подписчики получат испускаемые данные. - вот ссылка на (старые) документы, которые в основном объясняют именно вашу проблему: https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/share.md – olsn

 Смежные вопросы

  • Нет связанных вопросов^_^