rxjs angular2 使用无限循环遍历数组
rxjs angular2 iterate over array with infinite loop
我正在尝试创建一个遍历数组中的元素的循环,并且我想 运行 循环一旦完成就重新开始。
我从以下片段开始
Observable.interval(1000).startWith(0)
.repeat()
.take(array.length)
.map(i => array[i])
.subscribe(item => {
// some operation here
});
但它对我的情况不起作用。
您的代码的问题是您将 take
放在 repeat
之后,因此 take
将取消订阅源和 repeat
。
另一种选择是只取数组的第 % n
个元素,因为 interval
发出数字,我们可以使用它。我注意到您将 startWith
添加到 interval
。获得没有延迟开始的间隔的另一种方法是使用 timer(0, interval)
。因此我们的最终代码可能如下所示:
Observable.timer(0, 1000)
.map(e => array[e % array.length])
.subscribe(item => { ... })
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))
我正在尝试创建一个遍历数组中的元素的循环,并且我想 运行 循环一旦完成就重新开始。
我从以下片段开始
Observable.interval(1000).startWith(0)
.repeat()
.take(array.length)
.map(i => array[i])
.subscribe(item => {
// some operation here
});
但它对我的情况不起作用。
您的代码的问题是您将 take
放在 repeat
之后,因此 take
将取消订阅源和 repeat
。
另一种选择是只取数组的第 % n
个元素,因为 interval
发出数字,我们可以使用它。我注意到您将 startWith
添加到 interval
。获得没有延迟开始的间隔的另一种方法是使用 timer(0, interval)
。因此我们的最终代码可能如下所示:
Observable.timer(0, 1000)
.map(e => array[e % array.length])
.subscribe(item => { ... })
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))