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)
  • 相关阅读:
    内置函数二
    内置函数一
    lambda表达式
    函数参数
    set集合
    元组和字典的功能
    列表功能介绍
    分篮子
    松鼠配对?
    奇数次的数?
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9715065.html
Copyright © 2011-2022 走看看