zoukankan      html  css  js  c++  java
  • [RxJS] Implement RxJS `switchMap` by Canceling Inner Subscriptions as Values are Passed Through

    switchMap is mergeMap that checks for an "inner" subscription. If the "inner" subscription exists, switchMap unsubscribes from that "inner" subscription which effectively "cancels" any pending pushes.

    import { fromEvent, of, Subscriber } from "rxjs"
    import {
      scan,
      delay,
      mergeMap,
      switchMap
    } from "rxjs/operators"
    
    class MySwitchMapSubscriber extends Subscriber {
      innerSubscription
    
      constructor(sub, fn) {
        super(sub)
    
        this.fn = fn
      }
    
      _next(value) {
        console.log(`outer`, value)
        const o$ = this.fn(value)
    
        if (this.innerSubscription) {
          this.innerSubscription.unsubscribe()
        }
    
        this.innerSubscription = o$.subscribe({
          next: value => {
            console.log(`  inner`, value)
            this.destination.next(value)
          }
        })
      }
    }
    
    const mySwitchMap = fn => source =>
      source.lift({
        call(sub, source) {
          source.subscribe(
            new MySwitchMapSubscriber(sub, fn)
          )
        }
      })
    
    const observable$ = fromEvent(
      document,
      "click"
    ).pipe(
      scan(i => i + 1, 0),
      mySwitchMap(value => of(value).pipe(delay(500)))
    )
    
    const subscriber = {
      next: value => {
        console.log(value)
      },
      complete: () => {
        console.log("done")
      },
      error: value => {
        console.log(value)
      }
    }
    
    observable$.subscribe(subscriber)
  • 相关阅读:
    devel包
    Tomcat性能调优
    详述Oracle RAC的五大优势及其劣势
    Oracle实例内存(SGA和PGA)调整
    ubuntu upstart启动流程分析
    Python爬虫示例
    Tcp连接的七次握手浅析
    Apache的prefork模式和worker模式
    减少mysql主从数据同步延迟
    Ubuntu14.04 64bit安装Android-Studio
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9715065.html
Copyright © 2011-2022 走看看