RxJS combineLatest:只有一个值发生变化后如何获得发射?

RxJS combineLatest:只有一个值发生变化后如何获得发射?

问题描述:

我在学习RxJS库。其中一个我不太明白的案例在this jsfiddle(代码也在下面)中有描述。RxJS combineLatest:只有一个值发生变化后如何获得发射?

var A= new Rx.Subject(); 
var B= new Rx.Subject(); 

A.onNext(0);  

// '.combineLatest' needs all the dependency Observables to get emitted, before its combined signal is emitted. 
// 
// How to have a combined signal emitted when any of the dependencies change (using earlier given values for the rest)? 
//  
A.combineLatest(B, function (a,b) { return a+b; }) 
.subscribe(function (v) { console.log("AB: "+ v); }); 

B.onNext("a"); 
A.onNext(1); 

我想得到两个发射到“AB”日志记录。一个从B变为“a”(A的值已经为0)。另一个将A更改为1.

但是,只有订阅后发生的更改似乎很重要(即使A具有值并因此可以计算组合结果)。

我应该使用“hot observables”作为这个还是其他方法,而不是.combineLatest

我在实际代码中的问题(比这个示例更大)是我需要在订阅后进行单独的初始化,这会在两个独立的位置切割东西,而不是初始值明显在前面。

感谢

我想你误会怎么Subjects工作。 Subjects热观测。他们不坚持价值观,所以如果他们收到一个没有订户的onNext,那么这个价值就会失去世界。

您正在寻找的是BehaviorSubjectReplaySubject,它们都保留过去的价值,重新发布它们给新的订户。在前一种情况下,你总是有一个初始值

//All subscribers will receive 0 
var subject = new Rx.BehaviorSubject(0); 

//All subscribers will receive 1 
//Including all future subscribers 
subject.onNext(1); 
在你设定值的数量,后者

构建它被重播每个订阅

var subject = new Rx.ReplaySubject(1); 
//All new subscribers will receive 0 until the subject receives its 
//next onNext call 
subject.onNext(0); 

重写你的榜样则可能是:

var A= new Rx.BehaviorSubject(0); 
var B= new Rx.Subject();  

// '.combineLatest' needs all the dependency Observables to get emitted, before its combined signal is emitted. 
// 
// How to have a combined signal emitted when any of the dependencies change (using earlier given values for the rest)? 
//  
A.combineLatest(B, function (a,b) { return a+b; }) 
.subscribe(function (v) { console.log("AB: "+ v); }); 

B.onNext("a"); 
A.onNext(1); 

//AB: 0a 
//AB: 1a 

另一方面,当然意识到这对你来说是全新的,在大多数情况下,你不需要直接使用Subject,因为它通常是mea恩,你试图将Rx转化为你已知范例的安全性。你应该问自己,你的数据来自哪里?它是如何创建的?如果你足够提出这些问题,那么按照事件链回到源头,10次中有9次你会发现它可能包含一个Observable包装。

+0

很好回答Paul,谢谢! BehaviorSubject确实对我有用,而且我非常重视您编写的最后一段。我敢打赌,你是对的。我的价值观来自鼠标拖动;将继续使用Rx文档来更充分地理解它。 – akauppi

+1

@akauppi yep鼠标拖动当然是可观察的事件,检查[fromEvent](https://github.com/Reactive-Extensions/RxJS/blob/master/doc/api/core/operators/fromevent.md)。在充分利用Rx经验的同时,您还可以学习如何从可观察鼠标事件的源头一路串联到仅使用Rx操作员的最终可观察结果,而无需直接与'Subjects '。 – Brandon

+0

@Brandon我现在在学习Rx。 :)最终会公开我将SVG和RxJs结合在一起的实验(想想把对象绑在一起)。 – akauppi