0

windowWithMaxCount のように機能しますが、ウィンドウ サイズは 1 から maxCount に変更されます。

私がやっていることは、イベントの c ストリームに基づいて折れ線グラフを描画することです。折れ線グラフには、たとえば 50 ポイントの配列が必要です。新しいポイントが到着したら、右側に 1 つのポイントを押し出し、この新しいポイントを左側に配置する必要があります。

したがって、一般的に observable.windowWithCount(50,1) はまさにそれを行います。最初のウィンドウで、50 個の要素すべてが利用可能になるまで待たなければならないという唯一の問題。この間、ユーザーの画面には何も表示されません。

代わりに、最初のポイントが到着するとすぐに、サイズ 1 のウィンドウを取得し、次にサイズ 2 のウィンドウを取得し、サイズ 50 (maxCount) のウィンドウに到達するまで続けます。この時点で、後続のすべてのウィンドウのサイズは 50 になります。

画面上の効果は、画面全体を感じるまで、画面を左から右に塗りつぶす行になります。

4

1 に答える 1

0

あなたが説明しているのはbufferWithCount. 実際にwindowWithCountは、オブザーバブルをすぐに生成し、そのオブザーバブルはすぐにアイテムを生成し始めます。おそらく、あなたはtoArrayどこかで(または同様のことを)行っており、ウィンドウを強制的に完了させてからアイテムを生成しています。これは、イメージを描画する前にすべてのポイントを同期しようとしていることが原因である可能性があります。代わりに、発生したイベントをそのまま使用する必要があります。ただし、これを行うと、ウィンドウが確実にオーバーラップするため、描画が重複することになります。

実際には、おそらくあなたが望むのは、もっと似たものscanです...

var Rx = require('rx'),
    Observable = Rx.Observable,
    log = console.log.bind(console),
    source = Observable.interval(25),
    points = source.scan([], function (acc, point) {
        if (acc.length === 50) {
            // Remove the last item
            acc.shift();
        }

        // Add the next item
        acc.push(point);
        return acc;
    }),
    subscription = points.subscribe(log);

このアプローチは、アイテムごとに新しいオブザーバブルを作成するのではなく、1 つのオブザーバブルのみを作成するため、より効率的です。

アプローチを一般化する場合は、演算子を作成できます。

Rx.Observable.prototype.rollingBuffer = function (count) {
    return this.scan([], function (acc, point) {
        var length  = acc.length,
            start   = (length >= count)
                    ? (length - count + 1)
                    : 0;
        return acc
            .slice(start)
            .concat([point]);
    });
};
于 2014-05-05T19:51:58.373 に答える