點燈坊

失くすものさえない今が強くなるチャンスよ

タグ : RxJS

呼叫 API 顯示 Nested Promise

若 API 遵循 RESTful 精神設計,常會第一個 API 僅回傳 id,若要取得其值就要呼叫第二個 API,也就是所謂 N + 1,本文分別以 Aysnc Await、Promise Chain 與 RxJS 三種寫法示範。

如何處理相依性 API ?

實務上有些 API 呼叫有順序性,無論 Promise 或 Observable 都是 Asynchronous,不保證回傳順序也不保證一定成功,因此處理這些 Asynchronous 動作並不像 Synchronous 般簡單。

使用 switchMap() 與 mergeMap() 實現分頁

由於 DOM Event 為 Observable,API Request 亦為 Observable,若 Table 亦必須由 N + 1 Query 呼叫其他 API 取得資料,這就造成了 Observable of Observable of Observable 的三層 Higher Order Observable,這該如何使用 RxJS 實現呢 ?

使用 exhaustMap() 捨棄完成前的 Inner Observable

Front-end 兩大 Asynchronous 就是 DOM Event 與 API Request,實務上常將這兩個 Asynchronous 視為 Observable 一起處理,這導致了 Higher Order Observable 出現,RxJS 提供了 mergeMap()concatMap()switchMap()exhaustMap() 處理,本文探討 exhaustMap()

使用 concatMap() 維持 Outer Observable 順序

Front-end 兩大 Asynchronous 就是 DOM Event 與 API Request,實務上常將這兩個 Asynchronous 視為 Observable 一起處理,這導致了 Higher Order Observable 出現,RxJS 提供了 mergeMap()concatMap()switchMap()exhaustMap() 處理,本文探討 concatMap()

使用 mergeMap() 攤平 Higher Order Observable

Front-end 兩大 Asynchronous 就是 DOM Event 與 API Request,實務上常將這兩個 Asynchronous 視為 Observable 一起處理,這導致了 Higher Order Observable 出現,RxJS 提供了 mergeMap()concatMap()switchMap()exhaustMap() 處理,本文探討 mergeMap()

RxJS 初體驗

若說 Ramda 是 FP 對於 Synchronous 解決方案,RxJS 則是 FP 在 ECMAScript 對於 Asynchronous 解決方案。Vue 官方已經將 RxJS 整合進 Vue,稱為 Vue-rx。

RxJS 之美

Asynchronous 為 ECMAScript 無法逃避的課題,該如何才能以相同 Mental Model 同時處理 Synchronous 與 Asynchronous 呢 ?

使用 mergeMap() 呼叫有相依性 API

由於 RESTful API 特性,實務上常會遇到無法單一 API 就能拿到結果,必須連續呼叫多次 API,本文分別以 Async Await、Promise Chain、Ramda 與 RxJS 示範,可比較其背後不同 Mental Model 。

使用 share() 避免重複 API Request

RxJS 因為是 Reactive,因此由 Observable 建立其他 Observable 時,也會重發新 API Request 反應最新資料,若我們想重複使用既有 Observable 且不建立新 API Request,可使用 share() 達成需求。

如何在 API 未完成時將 Button Disabled ?

由於讀取 API 為 Asynchronous 行為,若 Data 未及時回應,User 可能會再次按下 Button 而造成 Mutiple API Request,因此比較好的方式是當按下 Button 後立即將 Button Disabled,等 API 回傳完整後才將 Button Enabled。

如何每隔一段時間才取得 Input 值 ?

若想 Input 輸入值就直接打 API,而不要透過 Button Click,傳統會寫在 input Event,但若想每隔一段時間才取得 Input 值減少 API Request,也就是所謂 Debounce,自行要實作就沒那麼簡單,但透過 RxJS 可簡單實現。