長めのしっかり解説した記事が多いので、ここでは端的に要点をまとめてみる。
Taskの使い方ざっくり
Taskは基本的に非同期処理の結果をMsgのペイロードに乗せてCmdを発行するために使われる。
具体的な使い方
言葉で
Task.attempt (ResultをペイロードにとるMsgのコンストラクタ) (Task e x)
コードで
type Msg = ExampleMsg (Result e x)
Task.attempt (ExampleMsg (Result e x)) (Task e x)
Taskのeとx、ExampleMsgのペイロードであるところのResultのeとxが一致することが重要。
失敗する可能性がない場合はattemptではなくperformを用いる。
言葉で
Task.perform (xをペイロードにとるMsgのコンストラクタ) (Task Never x)
コードで
type Msg = ExampleMsg x
Task.perform (ExampleMsg x) (Task Never x)
以下、それぞれattemptとperformの定義
attempt : (Result x a -> msg) -> Task x a -> Cmd msg
perform : (a -> msg) -> Task Never a -> Cmd msg
ちなみに、Taskの定義は幽霊型だったりする。
type Task err ok = Task
よって、Taskを生成するためにはsucceed
やfail
を始めとしたAPIを用いる必要がある。
succeed : a -> Task x a
fail : x -> Task x a
便利な点
map
やandThen
、onError
やmapError
を使用することでCmdにする前にTask e x
のe
とx
を自在に変換しておくことができる。
よって、最終的に欲しい値以外のtempな値をCmdで飛ばしたりmodelに保持したりする必要がなくなる。
参考
Task - core 1.0.2 | elm-lang.org
ElmでHttpをわかってしまおう - @ababup1192 | Qiita
以上。