我对使用shared创建的Rx.Observable.just流的行为感到困惑。
例如:
var log = function(x) { console.log(x); };
var cold = Rx.Observable
.just({ foo: 'cold' });
cold.subscribe(log); // <-- Logs three times
cold.subscribe(log);
cold.subscribe(log);
var coldShare = Rx.Observable
.just({ foo: 'cold share' })
.share();
coldShare.subscribe(log); // <-- Only logs once
coldShare.subscribe(log);
coldShare.subscribe(log);这两个流都只发出一个事件,但非共享的事件可以订阅三次。为什么会这样呢?
我需要“分叉”一个流,但是共享它的值(然后组合分叉流)。
如何共享流的值,但也可以多次订阅它?
我知道这可能与“冷”和“热”可观测的概念有关。然而:
Rx.Observable.just()所创建的流是冷还是热?发布于 2015-11-14 21:30:11
Rx.Observable.just()所创建的流是冷还是热?
冷的。
如何确定前一个问题的答案?
我想这些文件是唯一的指南。
我如何分享一个流的价值,但也可以多次订阅它?
您正在寻找可观察的可连接的的想法。举个例子:
var log = function(x) { console.log(x); };
var coldShare = Rx.Observable
.just({ foo: 'cold share' })
.publish();
coldShare.subscribe(log); // Does nothing
coldShare.subscribe(log); // Does nothing
coldShare.subscribe(log); // Does nothing
coldShare.connect(); // Emits one value to its three subscribers (logs three times)
var log = function(x) {
document.write(JSON.stringify(x));
document.write("<br>");
};
var coldShare = Rx.Observable
.just({ foo: 'cold share' })
.publish();
coldShare.subscribe(log); // <-- Only logs once
coldShare.subscribe(log);
coldShare.subscribe(log);
coldShare.connect();<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.min.js"></script>
上面的例子记录了三次。使用publish和connect,您基本上可以“暂停”可观察到的内容,直到调用connect为止。
另请参阅:
发布于 2015-11-15 08:11:06
我不明白你的第一个问题,但关于最后一个问题,因为我也很难得到这个问题:
Observables/Observers的Rxjs实现基于观察者模式,类似于良好的旧回调机制。Rx.Observable.create以一个函数(如factory_fn为原始函数)作为参数,该函数接受一个观察者。您的值是由您在factory_fn主体中选择的计算生成的,而且由于您有参数中的观察者,所以您可以在合适时处理/推送生成的值。但是factory_fn没有被执行,它只是注册了(就像回调一样)。它将被称为每一次在相关的可观测的(即由Rx.Observable.create(factory_fn)返回的)上有一个Rx.Observable.create(factory_fn)。factory_fn返回值的取消值流的操作)。Rx.Observable是冷的。Rx.fromEvent )中可以看到,Rx.fromEvent产生了可观察的热点。(代码:https://github.com/Reactive-Extensions/RxJS/blob/master/src/core/linq/observable/fromevent.js)。publish算子是将冷观测转化为热点的算子之一。它的工作原理超出了我的范围,所以我不会在这里详细说明。Rx.DOM.fromWebSocket不产生热点可观测性(https://github.com/Reactive-Extensions/RxJS-DOM/blob/master/src/dom/websocket.js)。请参阅如何使用fromWebSocket主题缓冲流Rx.Observable)混为一谈。当这种情况发生的时候是很不幸的,但是我们想象的热源最终可能会被一个冷的Rx.Observable所代表。所以,是的,Rx.Observable.just创造了寒冷的可观测值。
https://stackoverflow.com/questions/33713466
复制相似问题