Elm 如何在一个函数中执行两个独立的操作?

Elm 如何在一个函数中执行两个独立的操作?,elm,Elm,如何在Elm中的一个函数内执行两个独立的操作?是否有任何模式或显式函数 一般来说,我不确定如何在内部实现ajax数据加载 例如,我想创建Http.get并像这样返回修改过的参数函数 fetchCustomers model = Http.get parseCustomers "/customers" `andThen` setCustomers { model | fetchingCustomers <- True } 获取客户模型= Http.get.parseCustomer

如何在Elm中的一个函数内执行两个独立的操作?是否有任何模式或显式函数

一般来说,我不确定如何在内部实现ajax数据加载

例如,我想创建
Http.get
并像这样返回修改过的参数函数

fetchCustomers model =
  Http.get parseCustomers "/customers" `andThen` setCustomers
  { model | fetchingCustomers <- True }
获取客户模型=
Http.get.parseCustomers“/customers”`然后`setCustomers
{模型太长了,读不下去了。
您可以通过在元组中返回两者来完成此操作。然后在
foldp
中拆分来自更新的信号,将模型部分放在视图函数中,并将任务放在要执行的端口中。这在最后的架构文章最后一个模式下有所提及

更长的答案 既然您链接到Elm体系结构,让我也链接到它,但特别是最后一部分:

在这里,您要做的是程序“更新”的一部分,您不仅要更新您的模型,还要做一些其他的事情。因此,您不仅要返回新模型,还要返回您想做的额外事情(在本例中是Http请求):


您可以在网站的“任务”下找到更多关于执行
Http
.

这是一个很好的答案!非常感谢!您能再解释一下您的代码吗:您从
app
返回一个元组。我看不到您在任何地方使用这个元组?它是用来强制第二个元组元素求值的吗?@nidu:您是指我从
start
返回的元组吗?它在
行中使用(输出,任务)=开始{model:model,view:view,update:update}
。你能澄清一下“update”的签名吗函数?它应该返回一个模型还是一个元组?它应该返回一个您希望执行的
模型和
任务的元组。您将如何建模一个不会导致任务的操作?我尝试让
更新
返回一个
可能任务的元组,但是我无法传递“可能任务”的信号再到端口;执行
任务。如果noop有奇怪的效果(我的任务有时不执行…),请成功执行

fetchCustomers model =
  ( { model | fetchingCustomers <- True }
  , Http.get parseCustomers "/customers" `andThen` setCustomers
  )
start app =
  let
    actions =
      Signal.mailbox Nothing

    address =
      Signal.forwardTo actions.address Just

    model =
      Signal.foldp
        (\(Just action) (model,_) -> app.update actions action model)
        -- ignore task: ^     ^^^              ^^^^^^^^:add mailbox
        app.model
        actions.signal
  in
    (Signal.map (fst >> app.view address) model, Signal.map snd model)
--  ^           ^^^^^^^     :split model:      ^^^^^^^^^^^^^^^^^^^^^^^


fetchCustomers actions model =
  ( { model | fetchingCustomers <- True }
  , Http.get parseCustomers "/customers"
    `andThen` (SetCustomers >> Signal.send actions.address)
  -- use mailbox to send Http results as an input action again
  )

-- larger update function you probably have
update actions action model = case action of
  -- ...
  SetCustomers cust -> setCustomers cust
  -- ...
  -- fetchCustomers actions model

(output, tasks) = start { model: model, view: view, update: update }

-- task execution:
port httpGets = tasks

-- output your view
main = output