如何从最后一项开始以相反方向从数组中发出值?

时间:2017-02-01 06:39:01

标签: rxjs rxjs5

我在哪里:

const observer = (item) => {
  console.log(item);
}

Observable.from([1,2,3,4,5])
  .take(3)
  .*******
  .subscribe(observer);

我想要进入控制台的是:

5
4
3

1 个答案:

答案 0 :(得分:4)

要获得该输出,您可以使用toArraymergeMap,但需要在take(3)之前撰写它们:

Rx.Observable.from([1, 2, 3, 4, 5])
  .toArray()
  .mergeMap(array => array.reverse())
  .take(3)
  .subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>

如果你有一个observable在它完成之前发出相对较少的值,那么这将正常工作。如果你有一个可以发出任意大量值的observable而你只想要倒数第三个 - 你可以使用reduce来避免必须缓冲每个发出的值:

Rx.Observable.from([1, 2, 3, 4, 5])
  .reduce((acc, value) => {
    acc.unshift(value);
    if (acc.length > 3) {
      acc.pop();
    }
    return acc;
  }, [])
  .mergeAll()
  .subscribe(value => console.log(value));
<script src="https://unpkg.com/rxjs@5/bundles/Rx.min.js"></script>