【问题标题】:Run two commands at the same time in Elm在 Elm 中同时运行两个命令
【发布时间】:2016-08-20 09:00:06
【问题描述】:

Elm 中,特别是Elm Architecture,当应用程序首次启动时,init 函数可以返回执行的Cmd Msg。我们可以使用它来发送 http 请求或通过 Elm ports 向原生 Javascript 发送消息。

我的问题是,如何发送多个应该在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,但它们似乎很适合运行多个任务,而不是专门的命令。

【问题讨论】:

    标签: javascript elm


    【解决方案1】:

    使用Platform.Cmd.batch (docs):

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

    【讨论】:

    • 命令是并行运行还是序列化?我正在考虑一批多个 HTTP 获取,如果序列化将需要很长时间。
    • @goertzenator 他们并行运行,而不是串行运行
    • 未指定顺序。由于 JavaScript 使用单线程运行,一个线程将在另一个线程之前运行,但您不应该对这个顺序做出任何假设。
    【解决方案2】:

    照 Sören 说的做,或者使用更新的、等效的“bang”-syntax:

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

    【讨论】:

    猜你喜欢
    • 2023-04-03
    • 1970-01-01
    • 2019-11-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多