【发布时间】:2016-12-25 02:01:28
【问题描述】:
我正在学习 Angular 2 和 rxjs。我有 3 个变量,A B C。
- B 取决于 A 的值
- C 取决于 A 和 B 的值
我正在尝试设置 observables:当 A 更新时,B 和 C 将自动更新。当 B 更新时,C 将自动更新。我尝试了两种设置,但都不令人满意。
- 第一次设置:B 订阅 observable A; C 订阅了 observable B withlatestfrom A。A 中的更改确实级联到 B,然后到 C,但来自 A 的值不是最新的。
- 第二次设置:B 订阅 observable A; C 订阅了 A 和 B 的 combineLatest observable。此设置有效,但我得到了 C 的两个更新,首先来自 B,然后来自 A。
如何设置我的 observables / 订阅,以便在更新 A 时,C 只会使用 A 和 B 的最新值更新一次?
编辑 - 添加代码
var A = new Rx.BehaviorSubject(1);
var A_Observable = A.asObservable();
var B = new Rx.BehaviorSubject(10);
var B_Observable = B.asObservable();
A_Observable.subscribe(function(A_value) {
var newB = A_value * 10;
// console.log("B auto updating to " + newB);
B.next(newB);
});
// LATEST FROM OBSERVABLE
var latestFromObservable = B_Observable.withLatestFrom(A_Observable);
latestFromObservable.subscribe(function(data) {
console.log("LATEST FROM : Value for A is " + data[1] + " ; Value for B is " + data[0]);
});
// COMBINE ALL OBSERVABLE
var combineAllObservable = Rx.Observable.combineLatest(A_Observable,B_Observable);
combineAllObservable.subscribe(function(data) {
console.log("COMBINE LATEST : Value for A is " + data[0] + " ; Value for B is " + data[1]);
});
// UPDATE TO A
setTimeout(function(){
console.log("UPDATING A");
A.next(2);
},1000);
// SATISFACTORY RESULT
setTimeout(function(){
console.log("SATISFACTORY RESULT : Value for A is 2 ; Value for B is 20 --- CALLED ONLY ONCE WITH LATEST VALUES");
},2000);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.min.js"></script>
【问题讨论】:
-
如果您包含代码而不是代码描述,您的问题会更清楚。
标签: angular rxjs reactive-programming rxjs5