2016-08-20 28 views
22

Elm中,具體是Elm Architecture當應用程序第一次啓動時init函數可以返回執行的Cmd Msg。我們可以使用它來發送http請求或通過Elm ports發送消息到本地JavaScript。在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.batchdocs):

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

完美!謝謝 – antfx

+0

命令是並行運行還是序列化?我正在考慮一批多個HTTP獲取,如果需要序列化,則需要很長時間。 – goertzenator

+1

@goertzenator他們並行運行,不在系列 – antfx

3

做的索倫說,或使用新的,相當於 「砰」 -syntax:

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