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