2017-05-14 49 views
1

我想創建一個循環遍歷數組中的元素,並且我希望在循環完成後再次運行循環。rxjs angular2遍歷無限循環的數組

我已經開始用下面的代碼片段

Observable.interval(1000).startWith(0) 
          .repeat() 
          .take(array.length) 
          .map(i => array[i]) 
          .subscribe(item => { 
// some operation here 
      });  

,但它並沒有我的情況下工作。

+0

地方重複array.length'後'。其實你可以只是做'Observable.interval(1000).map(e =>數組[e%array.length])' – Dorus

回答

0

您的代碼存在的問題是您在repeat之後放置了take,因此take將取消訂閱源和repeat

另一種選擇是隻取% n th數組元素,因爲interval發出數字,我們可以使用它。我注意到你添加了startWithinterval。獲得立即啓動間隔的另一種方法是使用timer(0, interval)。因此,我們最終的代碼可能看起來像:

Observable.timer(0, 1000) 
    .map(e => array[e % array.length]) 
    .subscribe(item => { ... }) 
+0

謝謝幫助很多 – Bazinga777

0
function arrayRepeat(array) { 
    var last = 0; 
    return function() { 
    if(last === array.length) last = 0; 
    return array[last++]; 
    } 
} 

Rx.Observable.create(obs => { 
    let nextItem = arrayRepeat([1,2,3]); 
    let in = setInterval(() => { 
    obs.next(nextItem()); 
}, 1000); 
return() => clearInterval(in); 
}).subscribe(x=>console.log(x)) 
+0

只是想知道,爲什麼你不取消間隔,如果可觀察的是取消訂閱?您可以在'create'內添加'return()=> clearInterval(interval)'。 – Dorus

+0

確定您可以添加它 –