2016-08-20 37 views
22

Trong Elm và cụ thể với Elm Architecture khi ứng dụng lần đầu tiên bắt đầu chức năng init có thể trả lại Cmd Msg được thực thi. Chúng tôi có thể sử dụng điều này để gửi yêu cầu http hoặc gửi thư đến Javascript gốc qua Elm ports.Chạy hai lệnh cùng lúc trong Elm

Câu hỏi của tôi là, làm thế nào tôi có thể gửi nhiều lệnh sẽ được thực hiện trong init?

Ví dụ tôi có thể làm một cái gì đó như:

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

Và tôi có thể làm điều gì đó như:

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

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


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

Làm thế nào tôi có thể trả lại cả hai lệnh cùng lúc từ init?

Tôi đã xem Task.sequence và thậm chí Task.parallel nhưng chúng có vẻ tốt cho việc chạy nhiều tác vụ, chứ không phải các lệnh cụ thể.

Trả lời

41

Sử dụng Platform.Cmd.batch (docs):

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

hoàn hảo! cảm ơn – antfx

+0

Các lệnh có chạy song song hoặc chúng được tuần tự hóa không? Tôi đang nghĩ về một loạt nhiều HTTP được mà sẽ mất một thời gian dài nếu serialized. – goertzenator

+1

@goertzenator chúng chạy song song, không phải trong chuỗi – antfx

3

Làm như Sören nói, hoặc sử dụng các phiên bản mới hơn, tương đương với "bang" -syntax:

init : (Model, Cmd Msg) 
init = 
    (Model "" []) 
    ! [fetchCmd, Ports.messageToJs "Hello JS"] 
Các vấn đề liên quan