點燈坊

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

同時使用多個 otherwise 處理 Rejected

Sam Xiao's Avatar 2021-08-07

若在 Promise Chain 同時使用多個 otherwise 時,只有第一個 otherwise 會被觸發,若要其他 otherwise 也執行,必須重新發出 Rejected。

Version

Ramda 0.27.1

otherwise

import { pipe, andThen as then, otherwise } from 'ramda'

let f = _ => Promise.reject ('error')

pipe (
  f,
  then (console.log),
  otherwise (console.log),
  otherwise (console.error)
) ()

f 回傳 Rejected,同時有兩個 otherwise

rethrow000

實際執行會發現只有第一個 otherwise 執行,因為已經處理 Rejected,所以第二個 otherwise 並不執行。

Rethrow Exception

import { pipe, andThen as then, otherwise } from 'ramda'

let f = _ => Promise.reject ('error')

pipe (
  f,
  then (console.log),
  otherwise (e => (console.log (e), Promise.reject (e))),
  otherwise (console.error)
) ()

若想要第二個 otherwise 也執行,必須在第一個 otherwise 重新回傳 Rejected。

rethrow001

Conclusion

  • 實務上在處理 API 回傳的 Rejected 時,可將 reset state 寫在第一個 otherwise 並重新回傳 Rejected,並將處理 status code 寫在第二個 otherwise