我看到了以下代码:



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。

谢谢,
萨尔

最佳答案

好了,解释完成了。此行为与flatMapLatestrange的关系更大,而与from的关系更大。

基本上range(1,3)同步发出其三个项目。然后,flatMapLatest将在同一滴答中仅发出第一个值'x'+a。在它发出第二个值之前,它需要先关闭该可观测值,因为来自range的新值已经到达,并且它需要产生新的对应可观测值(您知道,当新值到达时flatMapLatest会关闭当前可观测值,并且产生新的。不是latest的意思吗?

这样直到没有新值的最后一个值(3)为止,因此from可观察对象可以发出其完整值列表。

一些额外的有用链接:


marble for flatMapLatest



  flatMapLatest运算符的行为与标准FlatMap运算符非常相似,不同之处在于,每当源Observable发出新项目时,它将取消订阅并停止镜像从先前发射的项目生成的Observable,并且仅开始镜像当前项目。 。

07-24 20:22