はじめに
簡単な例を書きます。
例のために、こんな関数を用意しておきます。
alog :: String -> Aff Unit
alog = liftEffect <<< log
delay' :: Number -> Aff Unit
delay' = delay <<< Milliseconds
例1
Effect内で複数の処理(launchAff_ の中)を非同期で実行します。各処理の最初のログは同時に表示されますが、次のログは各々が持つ遅延処理を終えてからバラバラに出力されます。
例1
main :: Effect Unit
main = do
launchAff_ do
alog "[1 - 1]"
delay' 2100.0
alog "[1 - 2]"
launchAff_ do
alog "[2 - 1]"
delay' 1000.0
alog "[2 - 2]"
launchAff_ do
alog "[3 - 1]"
delay' 3500.0
alog "[3 - 2]"
launchAff_ do
alog "[4 - 1]"
delay' 1800.0
alog "[4 - 2]"
例2
Effect内で1つの非同期処理(launchAff_ の中)を立ち上げ、その中で複数の非同期処理(forkAff の中)を実行します。結果は例1と同じように見えます。
例2
main :: Effect Unit
main = launchAff_ do
_ <- forkAff do
alog "[1 - 1]"
delay' 2100.0
alog "[1 - 2]"
_ <- forkAff do
alog "[2 - 1]"
delay' 1000.0
alog "[2 - 2]"
_ <- forkAff do
alog "[3 - 1]"
delay' 3500.0
alog "[3 - 2]"
forkAff do
alog "[4 - 1]"
delay' 1800.0
alog "[4 - 2]"
例3
複数の非同期処理から得た戻り値を使います。
例3
main :: Effect Unit
main = launchAff_ do
f1 <- forkAff do
alog "[1 - 1]"
delay' 5100.0
alog "[1 - 2]"
pure "[1]"
f2 <- forkAff do
alog "[2 - 1]"
delay' 1000.0
alog "[2 - 2]"
pure "[2]"
_ <- forkAff do
alog "[3 - 1]"
delay' 3500.0
alog "[3 - 2]"
f4 <- forkAff do
alog "[4 - 1]"
delay' 1800.0
alog "[4 - 2]"
pure "[4]"
f2' <- joinFiber f2
alog $ f2'
f4' <- joinFiber f4
f1' <- joinFiber f1
alog $ f1' <> f2' <> f4'
※ ここで、一番時間のかかる処理はf1です。joinFiberによってf1の結果を先に取得しようとすると、f1が終わるまでその先がブロックされてしまいます。