草庐IT

javascript - 冷热可观察量 : are there 'hot' and 'cold' operators?

coder 2023-07-04 原文

我查看了以下 SO 问题: What are the Hot and Cold observables?

总结:

  • 冷可观察对象在有观察者使用它们时发出其值,即观察者接收到的值序列与订阅时间无关。所有观察者都将使用相同的值序列。
  • 热可观察对象会独立于其订阅发出值,即观察者收到的值是订阅时间的函数。

然而,我觉得热与冷仍然是一个困惑的根源。所以这是我的问题:

  • 默认情况下所有 rx observables 都是冷的吗(主体除外)?

    我经常读到事件是热 observable 的典型隐喻,但我也读到 Rx.fromEvent(input, 'click') 是冷 observable(?)。

  • 是否有/有哪些 Rx 运算符可以将冷可观察对象转换为热可观察对象(publishshare 除外)?

    例如,它如何与 Rx 运算符 withLatestFrom 一起工作?让 cold$ 成为一个已在某处订阅的冷可观察对象。 sth$.withLatestFrom(cold$,...) 会成为一个热可观察对象吗?

    或者如果我执行 sth1$.withLatestFrom(cold$,...), sth2$.withLatestFrom(cold$,...) 并订阅 sth1sth2,我总是会看到 sth 的相同值吗?

  • 我认为 Rx.fromEvent 会创建冷可观察对象,但事实并非如此,如其中一个答案中所述。但是,我仍然对这种行为感到困惑:https://codepen.io/anon/pen/NqQMJR?editors=101 .不同的订阅从同一个可观察对象中获得不同的值。 click 事件不是共享的吗?

最佳答案

几个月后我会回到我原来的问题,同时想分享获得的知识。 我将使用以下代码作为解释支持(jsfiddle):

var ta_count = document.getElementById('ta_count');
var ta_result = document.getElementById('ta_result');
var threshold = 3;

function emits ( who, who_ ) {return function ( x ) {
  who.innerHTML = [who.innerHTML, who_ + " emits " + JSON.stringify(x)].join("\n");
};}

var messages$ = Rx.Observable.create(function (observer){
  var count= 0;
  setInterval(function(){
    observer.onNext(++count);
  }, 1000)
})
.do(emits(ta_count, 'count'))
.map(function(count){return count < threshold})
.do(emits(ta_result, 'result'))

messages$.subscribe(function(){});

如其中一个答案所述,定义一个可观察对象会导致一系列回调和参数注册。必须启动数据流,这是通过 subscribe 函数完成的。 之后可以找到详细的流程(为便于说明而简化)。

Observables 默认是冷的。订阅一个可观察对象将导致上游订阅链发生。最后一个订阅导致执行一个函数,该函数将处理一个源并将其数据发送给它的观察者。

该观察者依次向下一个观察者发送数据,从而产生下游数据流,直至接收器观察者。下面的简化图显示了两个订阅者订阅同一个可观察对象时的订阅和数据流。

可以通过使用主题或通过 multicast 运算符(及其派生词,请参见下面的注释 3)来创建热可观察对象。

引擎盖下的multicast 运算符使用一个主题并返回一个可连接的可观察对象。所有对运算符的订阅都将是对内部主题的订阅。当 connect 被调用时,内部主体订阅上游可观察对象,数据流向下游。 主题在内部操作订阅的观察者列表,并将传入数据多播给所有订阅的观察者。

下图总结了这种情况。

最后,更重要的是了解观察者模式引起的数据流和操作符的实现。

例如,如果 obs 是热的,那么 hotOrCold = obs.op1 是冷的还是热的?无论答案是什么:

  • 如果obs.op1 没有订阅者,则没有数据流经op1。如果有热 obs 的订阅者,这意味着 obs.op1 可能会丢失一些数据
  • 假设 op1 不是类似多播的运算符,订阅两次 hotOrCold 将订阅两次 op1,并且来自 obs 将流经 op1 两次。

注释:

  1. 此信息应该对 Rxjs v4 有效。虽然第 5 版已经消失 经过相当大的更改,其中大部分仍然逐字适用。
  2. 未表示取消订阅、错误和完成流程,因为 它们不在问题的范围内。调度程序也不是 考虑在内。除其他事项外,它们会影响 数据流,但先验不是它的方向和内容。
  3. 根据用于多播的主题类型,有 不同的派生多播运算符:

学科类型 | `Publish` 运算符 | `Share` 运算符 ------------------ | -------------------------- | ------------------ Rx.主题 | Rx.Observable.publish | 发布分享 Rx.行为对象 | Rx.Observable.publishValue |分享值(value) Rx.AsyncSubject | Rx.Observable.publishLast |不适用 Rx.ReplaySubject | Rx.Observable.重播 |分享回放

更新:另见the following articles, here , and there ) 关于 Ben Lesh 的主题。

有关主题的更多详细信息可以在其他 SO 问题中找到:What are the semantics of different RxJS subjects?

关于javascript - 冷热可观察量 : are there 'hot' and 'cold' operators?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32190445/

有关javascript - 冷热可观察量 : are there 'hot' and 'cold' operators?的更多相关文章

  1. ruby-on-rails - rails : "missing partial" when calling 'render' in RSpec test - 2

    我正在尝试测试是否存在表单。我是Rails新手。我的new.html.erb_spec.rb文件的内容是:require'spec_helper'describe"messages/new.html.erb"doit"shouldrendertheform"dorender'/messages/new.html.erb'reponse.shouldhave_form_putting_to(@message)with_submit_buttonendendView本身,new.html.erb,有代码:当我运行rspec时,它失败了:1)messages/new.html.erbshou

  2. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  3. ruby-on-rails - Rails 3.2.1 中 ActionMailer 中的未定义方法 'default_content_type=' - 2

    我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer

  4. ruby - 在 jRuby 中使用 'fork' 生成进程的替代方案? - 2

    在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',

  5. ruby - 主要 :Object when running build from sublime 的未定义方法 `require_relative' - 2

    我已经从我的命令行中获得了一切,所以我可以运行rubymyfile并且它可以正常工作。但是当我尝试从sublime中运行它时,我得到了undefinedmethod`require_relative'formain:Object有人知道我的sublime设置中缺少什么吗?我正在使用OSX并安装了rvm。 最佳答案 或者,您可以只使用“require”,它应该可以正常工作。我认为“require_relative”仅适用于ruby​​1.9+ 关于ruby-主要:Objectwhenrun

  6. ruby-on-rails - rails : save file from URL and save it to Amazon S3 - 2

    从给定URL下载文件并立即将其上传到AmazonS3的更直接的方法是什么(+将有关文件的一些信息保存到数据库中,例如名称、大小等)?现在,我既不使用Paperclip,也不使用Carrierwave。谢谢 最佳答案 简单明了:require'open-uri'require's3'amazon=S3::Service.new(access_key_id:'KEY',secret_access_key:'KEY')bucket=amazon.buckets.find('image_storage')url='http://www.ex

  7. ruby - 无法让 RSpec 工作—— 'require' : cannot load such file - 2

    我花了三天的时间用头撞墙,试图弄清楚为什么简单的“rake”不能通过我的规范文件。如果您遇到这种情况:任何文件夹路径中都不要有空格!。严重地。事实上,从现在开始,您命名的任何内容都没有空格。这是我的控制台输出:(在/Users/*****/Desktop/LearningRuby/learn_ruby)$rake/Users/*******/Desktop/LearningRuby/learn_ruby/00_hello/hello_spec.rb:116:in`require':cannotloadsuchfile--hello(LoadError) 最佳

  8. ruby-on-rails - 新 Rails 项目 : 'bundle install' can't install rails in gemfile - 2

    我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="

  9. ruby-on-rails - rspec should have_select ('cars' , :options => ['volvo' , 'saab' ] 不工作 - 2

    关闭。这个问题需要detailsorclarity.它目前不接受答案。想改进这个问题吗?通过editingthispost添加细节并澄清问题.关闭8年前。Improvethisquestion在首页我有:汽车:VolvoSaabMercedesAudistatic_pages_spec.rb中的测试代码:it"shouldhavetherightselect"dovisithome_pathit{shouldhave_select('cars',:options=>['volvo','saab','mercedes','audi'])}end响应是rspec./spec/request

  10. ruby-on-rails - Rails 中的 NoMethodError::MailersController#preview undefined method `activation_token=' for nil:NilClass - 2

    似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai

随机推荐