RxJS - FlatMap观察者多次调用

kit*_*lku 5 rxjs

我试图了解flatMap的工作原理.我知道这是一种处理Observable <Observable <T >>的方法.

无论如何,我正在测试它的行为并且坚持这个:

let plusDom = document.querySelector('#plus');
let minusDom = document.querySelector('#minus');

let minusSource = Rx
              .Observable
              .fromEvent(minusDom, 'click');

let plusSource = Rx.Observable
  .fromEvent(plusDom, 'click');

plusSource
  .flatMap(function(c){
    console.log('Flatmap called');
    return minusSource;
  })
  .subscribe(function(e){
  console.log('done');
})
Run Code Online (Sandbox Code Playgroud)

这里是jsbin:https://jsbin.com/sefoyowuqe/edit html,js,console,output

我不明白这种行为:

3 clicks on plusDom prints:
Flatmap called
Flatmap called
Flatmap called
Run Code Online (Sandbox Code Playgroud)

1单击minusDom打印:

done
done
done
Run Code Online (Sandbox Code Playgroud)

为什么在点击minusDom时,它会像点击plusDom那样多次重放事件?

ols*_*lsn 3

flatMap基本上将返回的流平放在原始流中。您可能正在寻找的是switchMap,它将切换到返回的流,并在原始源通过丢弃旧流来发出数据时切换到流。

如有疑问,switchMap通常是最安全的替代方案。

请参阅大理石图进行比较:

Flatmap 不会删除之前“扁平化”的流并且:

flatMap 大理石图

Switchmap删除之前“切换”的流。

switchMap 大理石图