若在 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
。
實際執行會發現只有第一個 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。
Conclusion
- 實務上在處理 API 回傳的 Rejected 時,可將 reset state 寫在第一個
otherwise
並重新回傳 Rejected,並將處理 status code 寫在第二個otherwise