假设我从数组中构建Observable
,如:
Rx.Observable.of(["a","b","c"])
或
Rx.Observable.from(["a","b","c"])
然后如何以1s的间隔发出这些字符?
答案 0 :(得分:1)
这是一种方法。
您可以将每个数组项映射到另一个延迟1000毫秒的observable。这将为您提供一系列延迟1秒的可观察量。
[
Observable.from('a').delay(1000),
Observable.from('b').delay(1000),
Observable.from('c').delay(1000)
]
由于我们有一个2D结构(可观察数组),我们需要将其展平以访问数组中每个observable的值。
我们可以使用的一种展平模式是concatAll。由于我们正在执行map
后跟concatAll
,因此有一种速记方法 - concatMap - 为我们执行此操作。
const { Observable } = Rx;
const wrapAndDelay = (val) => {
return Observable
.from(val)
.delay(1000);
};
const stream = Observable
.from([ "a", "b", "c" ])
.concatMap(wrapAndDelay);
stream.forEach(console.log);

<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.min.js"></script>
&#13;
另一种方法可能是使用interval每秒发出一次值。默认情况下,interval
方法会为每个时间间隔(0
,1
,2
等等设置一个计数器,因此我们可以将每个值映射到数组条目中那个指数。
const { Observable } = Rx;
const arr = [ "a", "b", "c" ];
const stream = Observable
.interval(1000)
.timeInterval()
.take(arr.length) // say how many we need so we don't emit forever
.map(({ value }) => arr[value]);
stream.forEach(console.log);
&#13;
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/5.0.1/Rx.min.js"></script>
&#13;