如何在一个函数内执行两个独立的操作?
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" 下的网站上找到更多 examples 的 Http
。
如何在 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" 下的网站上找到更多 examples 的 Http
。