點燈坊

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

使用 allSettled() 只取得 Fulfilled Promise

Sam Xiao's Avatar 2020-04-05

Promise.allSettled() 雖然好用,唯其以 Static Method 設計,且也不適合 Function Pipeline,Wink-fp 提供 Function 化的 allSettled()

Version

macOS Catalina 10.15.4
WebStorm 2019.3.4
Node 12.4.0
ECMAScript 2020
Ramda 0.27.0
Wink-fp 1.20.67

ECMAScript

let data = [
  Promise.resolve(1),
  Promise.reject(2),
  Promise.resolve(3)
]

let f = a => Promise.allSettled(a)
  .then(x => x.filter(x => x.status === 'fulfilled'))
  .then(x => x.map(x => x.value))
  .then(console.log)
  .catch(console.log)

f(data)

Promise.all() 為 method chaining,且 filter()map() 都必須在 then() 內。

Wink-fp

import { filter, map, propEq, prop } from 'ramda'
import { pipeP, allSettled, log, resolve, reject } from 'wink-fp'

let data = [
  resolve(1),
  reject(2),
  resolve(3)
]

let f = pipeP(
  allSettled,
  filter(propEq('status', 'fulfilled')),
  map(prop('value')),
  log
)

f(data)

若使用 Wink-fp 的 allSettled() 則可使用 pipeP() 同時組合 allSettled()filter()map(),且 filter()map() 都不必躲在 then() 內。

allsettled000

Conclusion

  • Promise.allSettled() 定義在 ECMAScript 2020,為較新的 function,目前在 Quokka 還無法使用,但在 Node + Babel 與 Vue + Babel 可正常運作
  • 透過 Wink-fp 的 allSettled(),則 Promise.allSettled() 也能整合於 pipeP()