如何同步RxJS更新,以使中间值不被';你没有穿过小溪吗?

如何同步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

在我的系统中,我有一个源,两个“步骤”将源映射到一个新值,然后是一个总和,将这两个步骤组合在一起创建最终值。这个系统的初始运行正如我所希望的那样,产生了3的单个总和

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还占用大量内存。