如何延迟Rxjs中的序列发射

时间:2018-07-09 14:45:27

标签: rxjs observable

我有一个可观察的地方:

source.subscribe(i => console.log(i));
// output  ...n seconds... 'a' ...n seconds... 'b' ...n seconds... 'c'

您如何延迟它,以便当有人订阅它时,它会延迟n秒才能发出物品? 所以:

{{1}}

4 个答案:

答案 0 :(得分:1)

您可以只使用.delay()运算符:

messages: string[] = ['a', 'b', 'c'];
const source = from(messages).pipe(
    delay(1000)//delay for 1 second
)

记住要导入delay

import { delay } from 'rxjs/internal/operators';

答案 1 :(得分:1)

您可以使用zip将流与间隔合并:

zip(
  from(['a', 'b', 'c', 'd']),
  interval(1000),
  (a, b) => a
)
.subscribe(console.log);

zip将每个流的第n个元素组合成一个数组。这样我们就可以使用选择器功能:(a, b) => a。它确保仅使用第一流中的元素。 interval流仅用于延迟发射。

答案 2 :(得分:0)

const source = from(['a', 'b', 'c', 'd']);
const delayPerElements = source
  .pipe(map(v => of(v).pipe(delay(1000))), concatAll());
delayPerElements.subscribe(it => console.log(it));
// ... a ... b ... c ... d

我不知道这是否是最好的方法,但是对我有用。希望这对以后的人有所帮助。

根据@Igno Burk的建议:

const source = from(['a', 'b', 'c', 'd']);
const delayPerElements = source
  .pipe(concatMap(v => of(v).pipe(delay(1000))));
delayPerElements.subscribe(it => console.log(it));
// ... a ... b ... c ... d
return delayPerElements;

答案 3 :(得分:0)

我遇到了同样的问题,并按照以下代码解决了

const {from, of} = rxjs;
const {concatMap, delay} = rxjs.operators;

from(['a', 'b', 'c'])
   .pipe(concatMap((msg) => of(msg).pipe(delay(1000))))
   .subscribe(console.log);
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/6.4.0/rxjs.umd.min.js"></script>