iT邦幫忙

2022 iThome 鐵人賽

DAY 29
0
自我挑戰組

菜雞也能優雅的征服RxJS系列 第 29

菜雞們一起征服RxJS - day29: 所有客服人員都在忙線中,請稍後再播~謝謝 ~ exhaustAll, exhaustMap

  • 分享至 

  • xImage
  •  

  • 打電話給銀行客服,等待著轉接時間,卻常常等到~
    所有的客服人員都在忙線中,請稍後再撥,謝謝!

  • 也就是說,有客服人員閒置,才會接上線,沒有的話,抱歉請稍後再撥!

  • 今天我們要介紹的,就是像這樣的客服系統~ exhaustAllexhaustMap

exhaust


圖片來源-RxJS-exhaustAll

  • 從上方的彈珠圖來看,第一次click觸發,並接收到一個observable,特別的是~
    中間任何的事件再怎麼處發,都會被直接丟棄

case1:

stackblitz

import { fromEvent, map, exhaustAll, interval, take, tap } from 'rxjs';

// case1:=== exhaustAll ===
console.log('=== case1: exhaustAll ===');
const timer$ = interval(1000).pipe(take(3));
fromEvent(document, 'click')
  .pipe(
    tap(() => console.log('click!')),
    map(() => timer$),
    exhaustAll()
  )
  .subscribe(console.log);

  • 注意到了吧! exhaustAll就像一對一的接待一樣,只專注眼前的訂閱服務,而不理會過程中任何的干擾,這樣的特性,相當適合運用在使用者登入頁面的設計:

當使用者點選,送出帳號密碼的請求,過程中,我們暫時將Login按鈕disabled,直到系統回覆,才會進行下一個動作。

case2: 更帥~是一定要的

  • 前幾個章節都有提到,我們照樣學習怎麼帥一波

exhaustMap = map+exhaustAll
stackblitz

import {
  fromEvent,
  map,
  exhaustMap,
  exhaustAll,
  interval,
  take,
  tap,
} from 'rxjs';

// case2:=== exhaustMap ===
console.log('=== case2: exhaustMap ===');
const timer$ = interval(1000).pipe(take(3));
fromEvent(document, 'click')
  .pipe(
    tap(() => console.log('click!')),
    // map(() => timer$),
    // exhaustAll()
    exhaustMap(() => timer$) //<-- exhaustMap 帥一波
  )
  .subscribe(console.log);

✍Recap

  1. exhaustAll: 專注處理當前的observable,直到結束,才會接收新的observable
  2. exhaustMap: 等同於map+exhaustAll

總整理

  • 今天來到了第29天,剩下最後一天啦~~~!!能熬到現在,我自己都覺得超帥,好好的沉澱一下,明天仍是一場不簡單的硬仗,衝阿!

上一篇
菜雞們一起征服RxJS - Day28: 來者不拒,但請照順序排隊訂閱,謝謝 ~ concatAll, concatMap
下一篇
菜雞們一起征服RxJS - day30: 向後台發出請求並即時偵錯: ajax, catchError
系列文
菜雞也能優雅的征服RxJS32
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言