Elm 如何链接Cmd Msgs

Elm 如何链接Cmd Msgs,elm,Elm,我有一个需要按顺序运行的Cmd Msgs列表。我目前使用的是Cmd.batch list,但它们似乎都是同时运行的,因此应该稍后运行的命令不知道早期命令应该引入的模型的任何更改 我正在研究任务。然后,但不确定这是否是正确的方向,或者如何从任务中生成Cmd Msg。我是否走对了道路,或者有更好的方法来实现这一点,也许仍然使用Cmd.batch 我目前有两个函数receive:String->Model->Cmd Msg和processMsg:String->Model->Cmd Msg: rece

我有一个需要按顺序运行的
Cmd Msg
s列表。我目前使用的是
Cmd.batch list
,但它们似乎都是同时运行的,因此应该稍后运行的命令不知道早期命令应该引入的模型的任何更改

我正在研究
任务。然后
,但不确定这是否是正确的方向,或者如何从
任务
中生成
Cmd Msg
。我是否走对了道路,或者有更好的方法来实现这一点,也许仍然使用
Cmd.batch

我目前有两个函数
receive:String->Model->Cmd Msg
processMsg:String->Model->Cmd Msg

receive : String -> Model -> Cmd Msg
receive msg model =
  msg |> String.split "&"
      |> List.map String.trim
      |> List.sort
      |> List.map (processMsg model)
      |> Cmd.batch

processMsg : String -> Model -> Cmd Msg
...  (uses Cmd.Extra.message for Msg -> Cmd Msg)
编辑

edit2:我想我可以通过省略在
receive
/
processMsg
中使用模型来简化示例,但我意识到我需要新模型来形成每个后续消息。

我试图使用
Task.sequence
Task.process
,但没有成功。我可以让第一个命令成功运行,但我不知道如何扩展它以让所有命令运行:

receive : String -> Model -> Cmd Msg
receive msg model =
    let 
        msgs = 
            msg |> String.split "&" 
                |> List.map String.trim
                |> List.sort
                |> List.head
                |> Maybe.withDefault "none"
                |> Task.succeed
    in
        Task.perform Oops (processMsg model) msgs

processMsg : String -> Model -> Msg
...
我考虑过将
processMsg
更改为
processMsg:String->Task String Msg
,但是我不知道为
Task.perform的第二个参数提供什么。我不确定
Task.sequence
是如何处理这个问题的,因为当我尝试将它插入管道时,我最终得到的是

List(任务x字符串)->Task x(列表字符串)->Task x(列表消息)->Cmd(列表消息)

我不知道该怎么办。

将确保任务按顺序而不是同时运行

要从任务生成
Cmd msg
,请使用或

编辑

根据您更新的问题,我认为没有必要为此使用任务。听起来像是要将一系列更新链接在一起,这可以通过递归调用
update
函数本身来实现。您可以使用
List.foldl
为每个后续消息累积模型状态和命令

这里有一个简单的例子来说明我的意思:

更新消息模型=
味精案例
链msgs msgs->
让
链msg1(模型1,cmds)=
let(model2,cmds1)=更新msg1 model1
在模型2中![cmds,cmds1]
在里面
List.foldl链(型号![])msgs
_ ->
{model | message=model.message++“,“++toString msg}![]
您可以保证消息以正确的顺序传递给
update
,因为不需要将其包装在任务中,这会导致执行顺序不明确


这里有一个你可以直接粘贴到其中的文件:

我很难弄清楚如何使用
任务
s。。。请参阅我上面的编辑。Thanks@erp-我已经更新了我的答案,以显示如何在不需要执行任务的情况下完成这项工作。如果没有真正的理由为此使用任务,我建议使用上面的方法。我会尝试看看这是否适用于我,但我意识到我实际上需要每个连续的新图形来形成下一个
Msg
,因此我的实际问题可能比我最初认为的更复杂。如果我理解你的图形语句,您只需要确保每个消息都作用于前一个消息返回的模型,对吗?如果是这样的话,这正是我的foldl示例所做的(请参阅完整示例的要点)啊,是的,我的意思是
model
。是的,很好用,谢谢!我只需将
ChainMsgs(List Msg)
更改为
ChainMsgs(List String)
,并在
chain
的定义中添加
processMsg
语句,以转换
String->Msg