带有zip的Rx.Observable.repeat(无限期)会导致浏览器停止响应

时间:2014-04-24 12:12:46

标签: rxjs

以下代码会导致浏览器停止响应,使用类似' 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);

2 个答案:

答案 0 :(得分:1)

浏览器冻结,因为.repeat只是无限期地产生10

由于Rx是基于推送的,我们无法知道zip何时需要另一个项目。相反,我们只需将新值推送到zip即可。静态(类方法?)repeat说"嘿,我有新项目现在总是在这里他们是"永远不会放弃控制流回拉链。这意味着zip实际上永远不会订阅interval observable,因此zip只会无限期地开始缓冲。

如果你来自功能背景,那么它似乎是一个无限的" " 10" s的列表将与任何有限的列表很好地压缩。这是绝对正确的,假设你的无限列表是懒惰的。在这种情况下,我们的"列表"有自己的想法,绝对不是懒惰。

我很乐意提出一个解决方案,但似乎这个例子是人为的。你到底想要做什么?

答案 1 :(得分: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);