RXJS为什么只有最后一个数字同时包含a和b?

时间:2016-04-20 12:13:24

标签: javascript reactive-programming rxjs observable

我看到了以下代码:

var source = Rx.Observable
  .range(1, 3)
  .flatMapLatest(function(x) {
    return Rx.Observable.from([x + 'a', x + 'b']);
  });

var subscription = source.subscribe(
  function (x) {
    console.log('Next: %s', x);
    document.body.innerHTML += 'Next: ' + x + '<br>';
  },
  function (err) {
    console.log('Error: %s', err);
  },
  function () {
    console.log('Completed');
    document.body.innerHTML += 'Completed';
  });

// Next: 1a
// Next: 2a
// Next: 3a
// Next: 3b
// Completed
<script src="https://cdnjs.cloudflare.com/ajax/libs/rxjs/4.1.0/rx.all.js"></script>

我想了解为什么只有3 / last值同时包含a和b。

基本上我仍然难以理解Rx.Observable.from并将数组作为参数。

谢谢, 萨尔

1 个答案:

答案 0 :(得分:1)

嗯,它完成了解释。此行为更多地与flatMapLatestrange有关,与from有关。

基本上range(1,3)同时发出 这三项。然后flatMapLatest将在同一个时间点仅发出第一个值'x'+a。在它发出第二个值之前,它需要关闭已经存在的observable,因为来自range的新值已经到达,并且它需要生成新的相应observable(当新值到达时你知道flatMapLatest关闭当前可观察并产生新的。latest的含义不是它的意思。

这样直到最后一个值(3),在没有新值的情况下,因此from observable可以发出其完整的值列表。

一些额外的有用链接:

  

flatMapLatest运算符的行为与标准FlatMap运算符非常相似,只是当源Observable发出新项时,它将取消订阅并停止镜像从先前发出的项生成的Observable,并开始仅镜像现在的。