2014-04-24 38 views
1

以下代碼會導致瀏覽器停止響應,例如重複使用類似'100'的值來解決問題,但在我的情況下我沒有具體的價值。 請你提出一個解決方案:帶有zip的Rx.Observable.repeat(無限期地)導致瀏覽器停止響應

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); 

回答

1

瀏覽器凍結,因爲.repeat簡單地產生10下去。

由於Rx是基於推送的,因此我們無法知道zip何時需要另一個項目。相反,我們只是推出新的值到zip,因爲它們變得可用。靜態(類方法?)repeat說:「嘿,我有新的項目現在總是在這裏」,並永不放棄控制流回拉鍊。這意味着zip從來沒有真正結束訂閱interval observable,所以zip只是無限期地開始緩衝。

如果你來自功能性背景,那麼它看起來像一個「無限」的「10」列表將很好地壓縮任何東西的有限列表。這是絕對正確的,假設你的無限列表是懶惰的。在這種情況下,我們的「名單」有它自己的想法,而且絕對不是懶惰。

我很樂意提出一個解決方案,但似乎這個例子是人爲的。你究竟想要做什麼?

+0

我已經張貼這可能有助於讀者在這裏一個相關的問題:http://stackoverflow.com/questions/25893983/create-infinite-重複觀察的-從陣列。你介意看看嗎? – Yousef

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); 
相關問題