switchmap 和不同的 observables

SBK*_*per 0 rxjs angular

Angular 和 Rx 新手,试图理解这一点……我的应用程序对 UI 事件做出反应,这导致调用返回 Observable 的 HTTP 服务。我像这样订阅它:

this.myXYZService.search(query)
  .map(r => { // some code })
  .subscribe(r => { //some code });
Run Code Online (Sandbox Code Playgroud)

假设该事件再次触发,并导致对同一 HTTP 服务进行第二次调用,该服务将在第一次调用完成之前返回一个全新的 Observable。

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

我想我对整个事情感到困惑,因为 Observables 的实例是不同的 - 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 });
Run Code Online (Sandbox Code Playgroud)

如果我在上面两个都使用 switchMap 会发生什么?第二个调用会取消第一个调用吗?

LLa*_*Lai 7

当外部 observable 发出时,switchMap 取消前一个内部 observable。例如

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

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

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