如何同步RxJS更新,以使中间值不被';你没有穿过小溪吗?
在我的系统中,我有一个源,两个“步骤”将源映射到一个新值,然后是一个总和,将这两个步骤组合在一起创建最终值。这个系统的初始运行正如我所希望的那样,产生了3的单个总和如何同步RxJS更新,以使中间值不被';你没有穿过小溪吗?,rxjs,reactive-extensions-js,Rxjs,Reactive Extensions Js,在我的系统中,我有一个源,两个“步骤”将源映射到一个新值,然后是一个总和,将这两个步骤组合在一起创建最终值。这个系统的初始运行正如我所希望的那样,产生了3的单个总和 var source = new Rx.BehaviorSubject(0); var stepOne = source.map(function (value) { return value + 1; }); var stepTwo = source.map(function (value) { retur
var source = new Rx.BehaviorSubject(0);
var stepOne = source.map(function (value) {
return value + 1;
});
var stepTwo = source.map(function (value) {
return value + 2;
});
var sum = Rx.Observable.combineLatest(
stepOne,
stepTwo,
function (s1, s2) {
console.log('calc sum: ' + (s1 + s2));
return s1 + s2;
}).subscribe(function (sum) {
});
产出:
> calc sum: 3
但如果我为source输入一个新值,我会得到两个类似这样的结果:
source.onNext(1);
> calc sum: 4
> calc sum: 5
第一个是一个中间结果…当新的源值通过系统的一部分时,然后当所有值都完成传播时,我得到最终结果
所以我的问题是,推荐的配置方法是什么,以便推送到源代码中的新值能够原子地通过系统,并且只生成一个求和结果
谢谢 这就是
CombineTest
的工作原理,它确实令人困惑,因为它允许出现您所指出的这些暂时不一致的状态。从combinelatetest
中学习的关键是,每当它的任何一个源发出一个新项时,它都会发出一个新项,并且部分地发出,它没有任何类型的“等待”机制
在图表中
您可能需要的是zip
操作符。Zip等待其输入发出相互匹配的项。换句话说,一旦所有输入的第n项都已发出,zip的输出将发出其第n项。它非常适合于这种菱形情况,即您有源代码生成第一步
和第二步
,并且希望组合第一步
和第二步
在图表中
请记住,zip
假设输入具有相同的发射频率。在其他情况下,当第一步和第二步中的项目具有不同的排放频率时,您可能希望将它们组合在一起。然后您需要使用CombineTest
感谢您的回答,并链接到。这很有用,也很有趣!经过更多的阅读,我发现我可以获得使用Bacon.js及其特性后的行为。我认为RxJS不支持这一点,如果我错了,请有人纠正我。RxJS不支持,但这不会阻止你完成你需要的任何事情。这将是另一种方式。Zip是大多数情况下的解决方案。Bacon.js还占用大量内存。