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)
  • 相关阅读:
    Django基础
    Web框架
    JQuery
    16 Javascript
    axios+qs传值序列化时出现数组形式我们该如何修改呢?
    MyBatis 对象中含有对象的查询
    MyBatis 新增获取自增主键的小坑
    List、Set、Map
    事务的隔离级别
    mybatis配置中文参考文档
  • 原文地址:https://www.cnblogs.com/Answer1215/p/9715065.html
Copyright © 2011-2022 走看看