在不重播的情况下合并 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 合并。问题是 mergebutton1Click$ 中定义的 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();