如何从数组构建一个Observable并发出间隔为1s的项?

时间:2016-12-29 23:28:02

标签: javascript rxjs

假设我从数组中构建Observable,如:

Rx.Observable.of(["a","b","c"])

Rx.Observable.from(["a","b","c"])

然后如何以1s的间隔发出这些字符?

1 个答案:

答案 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;
&#13;
&#13;

另一种方法可能是使用interval每秒发出一次值。默认情况下,interval方法会为每个时间间隔(012等等设置一个计数器,因此我们可以将每个值映射到数组条目中那个指数。

&#13;
&#13;
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;
&#13;
&#13;