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

How do I make two independent actions inside one function?

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

一般来说,我不确定如何在 Elm Architecture 中实现 ajax 数据加载。

例如我想像这样Http.get和return修改参数函数

fetchCustomers model =
  Http.get parseCustomers "/customers" `andThen` setCustomers
  { model | fetchingCustomers <- True }

TL;DR

您可以通过 return 将两者都放在一个元组中来实现。然后在 foldp 中拆分来自更新的信号,将模型部分放在视图函数中,并将任务放在端口中以执行。这在架构 post 最后的 One Last Pattern.

下有所提及

更长的答案

既然你 link 了解 Elm 架构,那么让我也 link 了解它,但特别是最后一部分:One Last Pattern

您想在这里做的是程序 "update" 的一部分,您不仅可以更新模型,还可以做一些其他事情。因此,您不仅需要 return 新模型,还需要做额外的事情(在本例中为 Http 请求):

fetchCustomers model =
  ( { model | fetchingCustomers <- True }
  , Http.get parseCustomers "/customers" `andThen` setCustomers
  )

您可以粘贴包中的 start function,而不是像体系结构页面那样使用 StartApp。现在您可以访问操作来自的邮箱,因此您可以将其传递给您的更新,这样您也可以将您的 Http 结果发送到那里。您可以从更新函数中拆分 returning 的元组以实际执行任务:

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

您可以在 "tasks" 下的网站上找到更多 examplesHttp