我有一个可观察的地方:
source.subscribe(i => console.log(i));
// output ...n seconds... 'a' ...n seconds... 'b' ...n seconds... 'c'
您如何延迟它,以便当有人订阅它时,它会延迟n秒才能发出物品? 所以:
{{1}}
答案 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>