點燈坊

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

如何在 map 內使用回傳 Future 的 Function ?

Sam Xiao's Avatar 2021-08-01

若在 map 使用回傳 Future 的 Function,必須要搭配 parallel 才能取出 Array 內的 Future。

Version

Sanctuary 3.1.0
Fluture 14.0.0

Asynchronous map

import { encase, parallel, fork } from 'fluture'
import { inc } from 'ramda'
import { env as flutureEnv } from 'fluture-sanctuary-types'
import { create, env } from 'sanctuary'
import { error, log } from 'wink-fp'

let { pipe, map } = create ({ checkTypes: true, env: env.concat (flutureEnv) })

let data = [1, 2, 3]

let inc_ = encase (inc)

pipe ([
  map (inc_),
  parallel (Infinity),
  fork (error) (log),
]) (data) 

11 行

let inc_ = encase (inc)

使用 encase 直接將一般 function 轉成回傳 Future 的 function。

13 行

pipe ([
  map (inc_),
  parallel (Infinity),
  fork (error) (log),
]) (data) 

使用 pipe 組合 IIFE:

  • map (inc_):將 Array 與回傳 Future 的 function 綁定,回傳 Array Future
  • parallel (Infinity):所有 Future 同時執行,也可明確指定 Integer
  • fork (error) (log):解開 Future

map000

Conclusion

  • Quokka 可在 Array Promise 內顯示 Pending Promise,但無法在 Array Future 內顯示 Pending Future,只能自行使用 parallel 才能正確解開 Array Future

Reference

Fluture, parallel