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

由于 Rx 是基于推送的,我们无法知道何时zip需要另一个项目。相反,我们只是将新值推送到zip它们可用时。静态(类方法?)repeat说“嘿,我有新项目现在总是在这里”并且永远不会放弃控制流回到 zip。这意味着 zip 实际上永远不会订阅intervalobservable,因此 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 回答