RxJS5 随着时间的推移发出数组项并永远重复
RxJS5 emit array items over time and repeat forever
我想随着时间的推移发射数组项(每次发射之间间隔一秒),当所有项都发射完后,一遍又一遍地重复。
我知道怎么做,但我想知道是否有比..更简洁的东西
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));
谢谢
输出是..
"one"
"two"
"three"
"one"
"two"
"three"
etc
编辑:
ATOW,这里的答案总结为..
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);
});
您可以使用 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
});
Observable.interval(1000).map(i => MY_ARRAY[i % MY_ARRAY.length])
zip
是这里的首选运算符,但是使用 Observable.from
会在订阅时转储所有值,并且需要 zip 来保留值的副本。这对于大型阵列来说并不理想。 zip
的原始 IEnumerable<T>
重载实现为 zipIterable
.
const MY_ARRAY = ['one','two','three'];
Rx.Observable.interval(1000).zipIterable(MY_ARRAY, (_, v) => v).subscribe(v => console.log(v))
使用 zip
组合来自 interval
和 from
的流,以便对于每个间隔时间,都会发出一个值。然后你用 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);
});
我想随着时间的推移发射数组项(每次发射之间间隔一秒),当所有项都发射完后,一遍又一遍地重复。
我知道怎么做,但我想知道是否有比..更简洁的东西
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));
谢谢
输出是..
"one"
"two"
"three"
"one"
"two"
"three"
etc
编辑:
ATOW,这里的答案总结为..
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);
});
您可以使用 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
});
Observable.interval(1000).map(i => MY_ARRAY[i % MY_ARRAY.length])
zip
是这里的首选运算符,但是使用 Observable.from
会在订阅时转储所有值,并且需要 zip 来保留值的副本。这对于大型阵列来说并不理想。 zip
的原始 IEnumerable<T>
重载实现为 zipIterable
.
const MY_ARRAY = ['one','two','three'];
Rx.Observable.interval(1000).zipIterable(MY_ARRAY, (_, v) => v).subscribe(v => console.log(v))
使用 zip
组合来自 interval
和 from
的流,以便对于每个间隔时间,都会发出一个值。然后你用 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);
});