5

私のシステムでは、ソース、ソースを新しい値にマップする 2 つの「ステップ」、およびそれらの 2 つのステップを組み合わせて最終的な値を作成する合計があります。このシステムの最初の実行は期待どおりに機能し、単一の合計 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 に新しい値を入力すると、次のような 2 つの結果が得られます。

source.onNext(1);

> calc sum: 4
> calc sum: 5

1 つ目は中間結果です。新しいソース値がシステムの一部を通過し、すべての値の伝播が完了すると最終結果が得られます。

私の質問は、ソースにプッシュされた新しい値がシステムをアトミックに通過し、1 つの合計結果のみを生成するように構成するための推奨される方法は何ですか?

ありがとう!

4

1 に答える 1

1

あなたcombineLatestが指摘したように、これらの一時的に一貫性のない状態を許可するため、実際には混乱しています。ここから学ぶべき重要なことは、ソースのいずれかcombineLatestが新しいアイテムを発行するたびに新しいアイテムを発行することです。これは部分的に行われ、「待機」メカニズムのようなものはありません。

図では、http://rxmarbles.com/#combineLatest .

おそらく必要なのはzip演算子です。Zip は、入力が互いに一致するアイテムを発行するのを待ちます。つまり、zip の出力は、すべての入力から n 番目の項目がすべて発行されると、n 番目の項目を発行します。とを組み合わせたい、 と を生み出すsourceダイヤモンドケースに最適です。stepOnestepTwostepOnestepTwo

図では、http://rxmarbles.com/#zip

zip入力の放出頻度が同じであると仮定していることに注意してください。別のケースでは、放出の頻度が異なる場合に、stepOne の項目と stepTwo の項目を組み合わせたい場合があります。次に、を使用する必要がありますcombineLatest

于 2014-09-03T16:08:48.973 に答える