2016-08-20 3 views
22

В Elm, и в частности с помощью Elm Architecture, когда приложение начинает работу init, функция может вернуть Cmd Msg. Мы можем использовать это для отправки HTTP-запросов или отправки сообщения на собственный Javascript через Elm ports.Выполнять две команды одновременно в Elm

Мой вопрос в том, как я могу отправить несколько команд, которые должны быть выполнены в init?

Например, я могу сделать что-то вроде:

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

И я могу сделать что-то вроде:

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

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


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

Как я могу вернуть обе команды в то же время от init?

Я видел Task.sequence и даже Task.parallel, но они кажутся хорошими для запуска нескольких задач, а не только команд.

ответ

41

Использование Platform.Cmd.batch (docs):

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

отлично! thanks – antfx

+0

Выполняют ли команды параллельно или они сериализуются? Я думаю о пакете нескольких HTTP-запросов, которые занимают много времени, если они будут сериализованы. – goertzenator

+1

@goertzenator они работают параллельно, а не в серии – antfx

3

Делай, как говорит Сорен, или использовать новый, эквивалентный "взрыва" -syntax:

init : (Model, Cmd Msg) 
init = 
    (Model "" []) 
    ! [fetchCmd, Ports.messageToJs "Hello JS"] 
Смежные вопросы