How to Trigger Multiple Msgs in Elm
In the Elm Architecture, update
function is responsible for changing Model
state. Depending on how you structure your Model
, Msg
, and update
, sometimes you may want to call update
function again with another Msg
after calling update
function. Recursively calling update
is straightforward.
type Msg
= FirstMsg
| SecondMsg
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
FirstMsg ->
update SecondMsg model
SecondMsg ->
model, Cmd.none ) (
But sometimes you may want to trigger multiple Msg
s. Task
can be used here.
type Msg
= FirstMsg
| SecondMsg ()
| ThirdMsg ()
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
FirstMsg ->
let
cmd =
Cmd.batch
Task.perform SecondMsg (Task.succeed ())
[ , Task.perform ThirdMsg (Task.succeed ())
]in
model, cmd )
(
SecondMsg ->
model, Cmd.none )
(
ThirdMsg ->
model, Cmd.none ) (
The caveat is that there’s no guaranteed ordering between SecondMsg
and ThirdMsg
, and that these subsequent Msg
s require arguments. Most importantly, I think recursively calling update
is a bad practice. Use this approach only when there’s absolutely no other way.