mikedavies-dev
mikedavies-dev

Reputation: 3345

Run two commands at the same time in Elm

In Elm, and specifically with the Elm Architecture when the app first starts the init function can return a Cmd Msg that is executed. We can use this for sending http requests or send a message to native Javascript via Elm ports.

My question is, how can I send multiple commands that should be executed in init?

For example I can do something like:

init : (Model, Cmd Msg)
init =
  (Model "" [], (Ports.messageToJs "Hello JS"))

And I can do something like:

url : String
url =
     "http://some-api-url.com"
...

fetchCmd : Cmd Msg
fetchCmd =
    Task.perform FetchError FetchSuccess fetchTask


init : (Model, Cmd Msg)
init =
  (Model "" [], fetchCmd)

How can I return both commands at same time from init?

I have seen Task.sequence and even Task.parallel but they appear to be good for running multiple tasks, not specifically commands.

Upvotes: 33

Views: 7290

Answers (2)

Søren Debois
Søren Debois

Reputation: 5688

Use Platform.Cmd.batch (docs):

init : (Model, Cmd Msg)
init =
  ( Model "" []
  , Cmd.batch [fetchCmd, Ports.messageToJs "Hello JS")]
  )

Upvotes: 61

swelet
swelet

Reputation: 8702

Do as Sören says, or use the newer, equivalent "bang" -syntax :

init : (Model, Cmd Msg)
init =
  ( Model "" [] )
  ! [fetchCmd, Ports.messageToJs "Hello JS"]

Upvotes: 5

Related Questions