RxJS - FlatMap观察者多次调用

时间:2016-12-23 12:49:54

标签: rxjs

我正在尝试了解 flatMap 的工作原理。我知道这是一种处理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');
})

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

我不明白这种行为:

3 clicks on plusDom prints:
Flatmap called
Flatmap called
Flatmap called

单击minusDom打印:

done
done
done

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

1 个答案:

答案 0 :(得分:3)

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

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

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

Flatmap之前没有删除"扁平化"溪流和:

flatMap Marble Diagram

Switchmap 先前删除"已切换"流。

switchMap Marble Diagram