Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/29.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular RxJS5随时间发射数组项,并永远重复_Angular_Rxjs_Rxjs5 - Fatal编程技术网

Angular RxJS5随时间发射数组项,并永远重复

Angular RxJS5随时间发射数组项,并永远重复,angular,rxjs,rxjs5,Angular,Rxjs,Rxjs5,我希望随着时间的推移(每次发射之间的间隔为1秒)发射阵列项目,并且在发射完所有项目后,反复重复 我知道怎么做,但我想知道是否有比..更简洁的东西 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

我希望随着时间的推移(每次发射之间的间隔为1秒)发射阵列项目,并且在发射完所有项目后,反复重复

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

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

您可以使用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
});

zip
是此处的go-to运算符,但使用的是可观察的
。from
转储订阅上的所有值,并要求zip保留值的副本。这对于大型阵列并不理想。
zip
的原始
IEnumerable
重载实现为


使用
zip
组合来自
interval
from
的流,以便为每个间隔时间发出一个值。然后,使用
repeat
操作符对上述可观察值进行管道传输,无需参数即可永远发出值

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

Zipitable不是RXJS5中的函数?将Zipitable()替换为zip()时工作。。我想你是在试图做一些我不太明白的事情。。谢谢你的回答,接受这个。其他答案也很好,但这是最短的(代码高尔夫赢家),也是最可读的。没有充分利用RXJS操作符,但有时简单是最好的。这是一个很好的答案,但我认为它不可读,团队中的其他所有开发人员都不会立即理解代码的作用。所以别忘了留下一条重要的评论:)我能理解你的观点。对我个人来说,这感觉更自然。我想可读性与团队的工作习惯有关。对某些人来说,使用\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\\?例如,如果在第一次迭代中,数组有23个项目,而在第二次迭代中,它有28个项目呢?但是迭代不应该停止,应该是无缝的,从一个项目移动到另一个项目。如果数组的长度随着时间的推移而改变,您将如何修改它?这里不鼓励只使用代码的答案。请添加您的答案如何解决问题的描述,以及为什么它可能比已经提供的其他答案更可取。
const MY_ARRAY = ['one','two','three'];
Rx.Observable.interval(1000).zipIterable(MY_ARRAY, (_, v) => v).subscribe(v => console.log(v))
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);
});