• [RxJS] SwitchAll()


    Converts a higher-order Observable into a first-order Observable producing values only from the most recent observable sequence

    switchAll marble diagram

    import './style.css';
    
    import { fromEvent, of, merge, empty, concat, defer } from 'rxjs';
    import {
      delay,
      map,
      mergeMap,
      tap,
      debounceTime,
      distinctUntilChanged,
      mapTo,
      filter,
      share,
      switchAll
    } from 'rxjs/operators';
    import { format } from 'date-fns';
    
    // track in progress saves
    let savesInProgress = 0;
    
    // references
    const input = document.getElementById('note-input');
    const saveIndicator = document.querySelector('.save-indicator');
    
    // streams
    const keyup$ = fromEvent(input, 'keyup');
    
    // fake save request
    const saveChanges = value => {
      return of(value).pipe(delay(1500));
    };
    
    /**
     * Trigger a save when the user stops typing for 200ms
     * After new data has been successfully saved, so a saved
     * and last updated indicator.
     */
    const inputToSave$ = keyup$.pipe(
      debounceTime(200),
      // @ts-ignore
      map(e => e.target.value),
      distinctUntilChanged(),
      share()
    );
    
    const savesInProgress$ = inputToSave$.pipe(
      mapTo(of('Saving')),
      tap(_ => {
        savesInProgress++;
        console.log('savesInProgress++', savesInProgress);
      })
    );
    
    const savesCompleted$ = inputToSave$.pipe(
      mergeMap(saveChanges),
      tap(_ => {
        savesInProgress--;
        console.log('savesInProgress++', savesInProgress);
      }),
      // ignore if additional saves are in progress
      filter(_ => !savesInProgress),
      mapTo(
        concat(
          // display saved for 2s
          of('Saved!'),
          empty().pipe(delay(2000)),
          // then last updated time, defer for proper time
          defer(() =>
            of(`Last updated: ${format(Date.now(), 'MM/DD/YYYY hh:mm:ss')}`)
          )
        )
      )
    );
    
    merge(savesInProgress$, savesCompleted$)
      .pipe(
        /*
       If new save comes in when our completion observable is running, we want to switch to it for a status update.
      */
        switchAll()
      )
      .subscribe(status => {
        saveIndicator.innerHTML = status;
      });

  • 相关阅读:
    python学习笔记[3]-邮件的发送
    python学习笔记[2]-join 和 split
    python学习笔记[1]-凯撒密码
    tar 指令详解
    mysql主从数据库配置
    国产免费高性能桌面录屏软件LiveView1.0正式发布
    原来163的大容量异步上传是这么实现的
    C++ string warning C4251
    你不知道的代码规范---摘自《软件随想录》
    ffmpeg avcodec_decode_video2 解码失败
  • 原文地址:https://www.cnblogs.com/Answer1215/p/15291619.html
Copyright © 2020-2023  润新知