Javascript RxJS扫描和组合测试行为

Javascript RxJS扫描和组合测试行为,javascript,reactive-programming,rxjs,Javascript,Reactive Programming,Rxjs,我一直在学习RxJs,在尝试确定使用scan和CombineTest时看到的输出背后的逻辑时遇到了问题 我有这个应用程序示例 var subject=new Rx.subject(); var stream=subject.map(函数(x){ 返回函数(v){ 返回v+“流”; }; }); var状态=Rx.Observable.merge(流) .startWith(“startWith”) .扫描(功能(x,f){ 控制台日志(“扫描”); 返回f(x); }); var view1=

我一直在学习RxJs,在尝试确定使用scan和CombineTest时看到的输出背后的逻辑时遇到了问题

我有这个应用程序示例

var subject=new Rx.subject();
var stream=subject.map(函数(x){
返回函数(v){
返回v+“流”;
};
});
var状态=Rx.Observable.merge(流)
.startWith(“startWith”)
.扫描(功能(x,f){
控制台日志(“扫描”);
返回f(x);
});
var view1=state.map(函数(x){
返回“view1”+x;
});
var view2=state.map(函数(x){
返回“view2”+x;
});
可观测组合测试(视图1、视图2、功能(x、y){
返回[x,y]。联接(“,”;
}).订阅(功能(x){
控制台日志(x);
});
subject.onNext(“一次”);

subject.onNext(“两次”)这是因为您订阅了两次
combinelateest
将隐式订阅您正在传递的两个流。当您首次使用Rx时,这是一个非常常见的错误,即除非运营商声称为每个订阅共享基础可观测数据,否则每个订阅将创建一个新的可观测数据流

也就是说,上面的代码在功能上相当于以下代码(但实际上不要这样做):

如果希望只调用一次扫描,则应在
scan()
之后使用,以便订阅服务器之间共享
scan
中的
Observable

因此,
状态
应该是:

var state = Rx.Observable.merge(stream)
  .startWith("StartWith")
  .scan(function(x, f) {
    console.log("scan");
    return f(x);
  })
  .share();

@paulpdaniels你能详细说明一下share的作用吗。文档将我带到一个奇怪的页面,它似乎与
share()
@MysticofChaos
share()
毫无关系,实际上只是包装了
publish().refCount()
。基本上,当第一个
观察者订阅时,它将连接源
可观察的
,然后它将在所有后续
观察者中共享该
可观察的
,不确定您使用的是什么链接,但这里是它的链接
var state = Rx.Observable.merge(stream)
  .startWith("StartWith")
  .scan(function(x, f) {
    console.log("scan");
    return f(x);
  })
  .share();