Rxjs 使用zip重复Rx.Observable.repeat(无限期)会导致浏览器停止响应

Rxjs 使用zip重复Rx.Observable.repeat(无限期)会导致浏览器停止响应,rxjs,Rxjs,下面的代码会导致浏览器停止响应,例如,在repeat中使用“100”这样的值可以解决问题,但在我的例子中,我没有它的特定值。 请您提出解决方案: var observer = Rx.Observer.create(function (x) { console.log(x); },

下面的代码会导致浏览器停止响应,例如,在repeat中使用“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);

由于
.repeat
只会无限期地产生
10
,因此浏览器会冻结

由于Rx是基于推送的,我们无法知道何时
zip
需要其他物品。相反,我们只要在可用时将新值推送到
zip
。静态(类方法?
repeat
表示“嘿,我现在有新项目,它们总是在这里”,并且从不放弃控制流回到zip。这意味着zip永远不会真正订阅可观察的
间隔,所以zip只是无限期地开始缓冲

如果你来自一个功能性的背景,那么它看起来就像是一个“无限”的“10”列表,可以很好地与一个有限的任何东西列表相匹配。这是绝对正确的,假设你的无限列表是懒惰的。在这种情况下,我们的“列表”有自己的想法,绝对不是懒惰


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

我正在处理同样的问题。看来
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);

我在这里发布了一个可能对读者有帮助的相关问题:。你介意看一下吗?