在不重播的情况下合并 RxJs 中的两个流
Merge two streams in RxJs without replay
我已将我的问题简化为这个简单的示例。
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
我通过过滤点击流创建了点击流和奇数点击流(基于当前时间)。
现在我想要一个流,它接收两个事件 'all' 和 'odd'。
所以我将这两个流与 merge
合并。问题是 merge
,button1Click$
中定义的 map
被调用了两次。假设如果我创建另一个名为 even$
的流并将其合并,则 map
将被调用三次。查看演示。
如何合并流,以便每次点击仅调用一次 map
(为 button1Click$
定义)。
只是 share
button1Clicked$
:
var button1Click$ = Rx.Observable.fromEvent(document.getElementById('button1'),'click')
.map(function(){
console.log('Map:all');
return "all"
})
.share();
我已将我的问题简化为这个简单的示例。
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
我通过过滤点击流创建了点击流和奇数点击流(基于当前时间)。
现在我想要一个流,它接收两个事件 'all' 和 'odd'。
所以我将这两个流与 merge
合并。问题是 merge
,button1Click$
中定义的 map
被调用了两次。假设如果我创建另一个名为 even$
的流并将其合并,则 map
将被调用三次。查看演示。
如何合并流,以便每次点击仅调用一次 map
(为 button1Click$
定义)。
只是 share
button1Clicked$
:
var button1Click$ = Rx.Observable.fromEvent(document.getElementById('button1'),'click')
.map(function(){
console.log('Map:all');
return "all"
})
.share();