RxJS switchMap 和不同的可观察对象

RxJS switchMap and different observables

Angular 和 RxJS 的新手,试图稍微了解一下...我的应用程序对 UI 事件做出反应,结果调用了一个 HTTP 服务 returns 是一个 Observable。我是这样订阅的:

this.myXYZService.search(query)
  .map(r => { // some code })
  .subscribe(r => { //some code });

假设该事件再次触发,并导致第二次调用同一个 HTTP 服务,这将 return 在第一次调用完成之前产生一个全新的 Observable。

现在,据我了解,我可以使用 switchMap 而不是 map 来丢弃旧的 Observable 并在新的 Observable 上操作?还是我理解有误?如果在第一个事件已经在链的订阅部分中之后触发第二个事件,会发生什么情况?这样的话就不会再切换了?而且由于 JS 是同步的,在第二个事件甚至开始处理其链之前,整个第一个链不会执行吗?

我想我对整个事情感到困惑,因为 Observable 的实例是不同的——Rx 如何跟踪要切换的调用?是函数名吗?假设我有 2 个独立的代码块:

this.myXYZService.search('abcd')
  .map(r => { // some code })
  .subscribe(r => { //some code });

this.myXYZService.search('efgh')
  .map(r => { // some code })
  .subscribe(r => { //some code });

如果我对以上两个都使用 switchMap 到底会发生什么?第二次调用会抵消第一次调用吗?

switchMap 在外部 observable 发出时取消之前的内部 observable。例如

Observable.fromEvent(inputEl, 'keydown') // outer observable
    .switchMap(event => {
        let value = event.value;

        return this.myXYZService.search(value); // inner observable
    })
    .subscribe(res => {
        // some code
    });

在这种情况下,每次外部 observable (fromEvent) 发出(在输入元素的 keydown 时),都会调用内部 observable (myXYZService.search) 并取消先前的内部 observable。

你会想要像...

searchTerms.switchMap( searchTerm => this.myXYZService.search(searchTerm) ).subscribe(...)

一旦出现新的搜索词,任何正在进行的搜索调用都将被忽略/丢弃。我不会使用取消这个词,因为电话还在响。但是,他们的结果将被忽略。

如果第一个请求 returns 在发出第二个搜索词之前,它将被发送到订阅。如果没有,那就不会。