首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >共享冷热观测数据

共享冷热观测数据
EN

Stack Overflow用户
提问于 2015-11-14 21:16:27
回答 2查看 927关注 0票数 1

我对使用shared创建的Rx.Observable.just流的行为感到困惑。

例如:

代码语言:javascript
运行
复制
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()所创建的流是冷还是热?
  • 如何确定前一个问题的答案?
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-11-14 21:30:11

Rx.Observable.just()所创建的流是冷还是热?

冷的。

如何确定前一个问题的答案?

我想这些文件是唯一的指南。

我如何分享一个流的价值,但也可以多次订阅它?

您正在寻找可观察的可连接的的想法。举个例子:

代码语言:javascript
运行
复制
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)

代码语言:javascript
运行
复制
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();
代码语言:javascript
运行
复制
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.0.7/rx.all.min.js"></script>

上面的例子记录了三次。使用publishconnect,您基本上可以“暂停”可观察到的内容,直到调用connect为止。

另请参阅:

票数 1
EN

Stack Overflow用户

发布于 2015-11-15 08:11:06

我不明白你的第一个问题,但关于最后一个问题,因为我也很难得到这个问题:

  • Observables/Observers的Rxjs实现基于观察者模式,类似于良好的旧回调机制。
  • 为了举例说明,下面是创建可观察的基本形式(取自https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/create.md的文档) var source =Rx.Observable.create(observer.onNext(观察者){ observer.onNext(42);observer.onCompleted ();//注意这是可选的,如果不需要清理返回函数(){console.log(‘disposed’;};}),则不必返回此函数);
  • 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创造了寒冷的可观测值。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/33713466

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档