RxJS5会随着时间的推移发出数组项并永远重复

时间:2016-12-19 15:02:52

标签: angular rxjs rxjs5

我希望随着时间的推移发出数组项目(每次发射之间间隔一秒),并且当所有项目都被发出时,重复一遍又一遍。

我知道怎么做,但我想知道是否有更简洁的东西......

const MY_ARRAY = ['one','two','three'];
const item$ = Rx.Observable.interval(1000).take(MY_ARRAY.length).repeat().map(x => MY_ARRAY[x]);
item$.subscribe(x => console.log(x));

感谢

输出是......

  

“一”

     

“二”

     

“三”

     

“一”

     

“二”

     

“三”

     

编辑:

现在,这里的答案总结为......

const ARR = ['one', 'two', 'three'];

// TAKE YOUR PICK THEY ALL DO THE SAME
const item$ = Rx.Observable.interval(1000).map(i => ARR[i % ARR.length]);
// const item$ = Rx.Observable.interval(1000).zip(ARR, (a, x) => x).repeat();
// const item$ = Rx.Observable.interval(1000).zip(ARR).repeat().map(x => x[1]);
// const item$ = Rx.Observable.interval(1000).take(ARR.length).repeat().map(i => ARR[i]);

item$.subscribe((x) => {
  console.log(x);
});

4 个答案:

答案 0 :(得分:4)

您可以使用zip操作符:

const interval$ = Rx.Observable.interval(1000);
const items$ = Rx.Observable.from([1,2,3]);

const itemsOverTime$ = interval$.zip(items$).repeat();


itemsOverTime$.subscribe(([time, val]) => {
  console.log(val);
  // 1
  // 2
  // 3
  // 1
  // 2
  // 3
});

答案 1 :(得分:4)

Observable.interval(1000).map(i => MY_ARRAY[i % MY_ARRAY.length])

答案 2 :(得分:1)

zip是此处的首选运算符,但使用Observable.from转储订阅上的所有值,并且需要zip来保留值的副本。这对于大型阵列来说并不理想。 IEnumerable<T>的原始zip重载实现为zipIterable

const MY_ARRAY = ['one','two','three'];
Rx.Observable.interval(1000).zipIterable(MY_ARRAY, (_, v) => v).subscribe(v => console.log(v))

答案 3 :(得分:0)

使用 zip 组合来自 intervalfrom 的流,以便对于每个间隔时间,都会发出一个值。然后,您使用 repeat 运算符将上述 observable 进行管道传输,不带任何参数以永远发出值。

const { interval, from, zip } = require('rxjs');
const { repeat } = require('rxjs/operators')

const itemsOverTime$ = zip(
    interval(1000),
    from(MY_ARRAY)
).pipe(repeat());

itemsOverTime$.subscribe(([time, val]) => {
    console.log(val);
});