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