2

次のコードでは、ブラウザーが応答を停止します。たとえば、繰り返しに「100」などの値を使用すると問題が解決しますが、私の場合、特定の値はありません。解決策を提案してください:

var observer = Rx.Observer.create(function (x)
                                  {
                                     console.log(x);
                                  },
                                  function (err)
                                  {
                                     console.log('Error: ' + err);
                                  },
                                  function ()
                                  {
                                     console.log('Completed');
                                  });

var repeat = Rx.Observable.repeat(10, null); //repeat indefinitely
var interval = Rx.Observable.interval(1000);

var zip = Rx.Observable.zip(repeat,
                            interval,
                            function(rep, inter)
                            {
                               return rep + inter;
                            });

zip.subscribe(observer);
4

2 に答える 2

1

.repeat単純に10無期限に生成されるため、ブラウザがフリーズします。

zipRx はプッシュベースであるため、いつ別のアイテムが必要になるかを知る方法がありません。代わりに、新しい値zipが利用可能になったときにプッシュするだけです。静的 (クラスメソッド?)repeatは、「ねえ、私は新しいアイテムを今すぐここに持っています」と言い、zip に戻る制御フローを放棄することはありません。これは、zip が実際にintervalオブザーバブルをサブスクライブすることは決してないことを意味するため、zip は無期限にバッファリングを開始します。

あなたが機能的なバックグラウンドを持っている場合、「10」の「無限」のリストは、何でも有限のリストでうまく圧縮されるように思えます。無限リストが遅延していると仮定すると、これは絶対に真実です。この場合、私たちの「リスト」は独自の考えを持っており、間違いなく怠け者ではありません。

解決策を提案させていただきますが、この例は不自然に思われます。いったい何をしようとしているのですか?

于 2014-04-24T16:56:21.260 に答える
0

私は同じ問題を扱っていました。delayトリックを行うことができるように見えます。

コードのわずかに変更されたバージョンは次のとおりです。

var observer = Rx.Observer.create(function (x)
                                  {
                                     console.log(x);
                                  },
                                  function (err)
                                  {
                                     console.log('Error: ' + err);
                                  },
                                  function ()
                                  {
                                     console.log('Completed');
                                  });

var repeat = Rx.Observable.of(10).delay(0).repeat(-1); //repeat indefinitely
var interval = Rx.Observable.interval(1000);

var zip = Rx.Observable.zip(repeat,
                            interval,
                            function(rep, inter)
                            {
                               return rep + inter;
                            });

zip.subscribe(observer);
于 2016-11-24T10:25:34.127 に答える