StartApp在Elm中的模型及效果
StartApp's Model and Effects in Elm
假设我有一些模型、动作集和更新函数如下:
type alias Model = Int
type Action = Succ
update : Action
-> Model
-> (Model, Effects Action)
update action model =
case action of
Succ ->
( model+1
, Effects.task <| Task.succeed Succ
)
这显然会在 hades 中形成一个无限循环,但我需要知道一个 关键 细节:任务引发的操作是否会看到 model+1
版本(这样这个任务会激发 "next" 模型),还是 运行 与当前模型版本 平行 model
?本质上,StartApp
将模型存储在元组的左侧 before 运行ning 效果以获得新的 Action?
我问这个的原因是我从我一直在写的这个简单的去抖动程序中得到的日志:http://lpaste.net/160866
当我使用这个模块时,我在触发循环时专门在模型中设置 debounceBounce = True
:
type alias AppModel =
{ appDebouncer : DebounceModel
}
type AppAction
= DebounceAction DebounceAction
| Finished
| Start
updateAppAction : AppAction
-> AppModel
-> (AppModel, Effects AppAction)
updateAppAction action model =
case action of
DebounceAction a ->
let (newDebounce, eff) =
updateDebounce Finished a model.appDebounce
in ( { model | appDebounce = newDebounce }
, Effects.tick (handleContinue DebounceAction) eff
)
Start ->
( { model | appDebounce =
let debouncer = model.appDebounce
in { debouncer | debounceBounce = True }
}
, Effects.tick (DebounceAction << Tick)
)
-- ...
我在我的机器上发现了很多日志特别是表明循环中的初始模型没有debounceBounce = True
设置。这有明确的原因吗?
Will the action sparked by the task see the model+1 version (such that this task sparks the "next" model), or will it be run in parallel to the current model version, model?
是的,效果作用于更新后的模型。在 StartApp
的源代码中,您可以看到模型和效果都捆绑在一个 fed into foldp
的元组中。当你使用 StartApp
时,你将每个模型更新和信号绑定到那个单一的 foldp
,所以你保证没有竞争条件。
假设我有一些模型、动作集和更新函数如下:
type alias Model = Int
type Action = Succ
update : Action
-> Model
-> (Model, Effects Action)
update action model =
case action of
Succ ->
( model+1
, Effects.task <| Task.succeed Succ
)
这显然会在 hades 中形成一个无限循环,但我需要知道一个 关键 细节:任务引发的操作是否会看到 model+1
版本(这样这个任务会激发 "next" 模型),还是 运行 与当前模型版本 平行 model
?本质上,StartApp
将模型存储在元组的左侧 before 运行ning 效果以获得新的 Action?
我问这个的原因是我从我一直在写的这个简单的去抖动程序中得到的日志:http://lpaste.net/160866
当我使用这个模块时,我在触发循环时专门在模型中设置 debounceBounce = True
:
type alias AppModel =
{ appDebouncer : DebounceModel
}
type AppAction
= DebounceAction DebounceAction
| Finished
| Start
updateAppAction : AppAction
-> AppModel
-> (AppModel, Effects AppAction)
updateAppAction action model =
case action of
DebounceAction a ->
let (newDebounce, eff) =
updateDebounce Finished a model.appDebounce
in ( { model | appDebounce = newDebounce }
, Effects.tick (handleContinue DebounceAction) eff
)
Start ->
( { model | appDebounce =
let debouncer = model.appDebounce
in { debouncer | debounceBounce = True }
}
, Effects.tick (DebounceAction << Tick)
)
-- ...
我在我的机器上发现了很多日志特别是表明循环中的初始模型没有debounceBounce = True
设置。这有明确的原因吗?
Will the action sparked by the task see the model+1 version (such that this task sparks the "next" model), or will it be run in parallel to the current model version, model?
是的,效果作用于更新后的模型。在 StartApp
的源代码中,您可以看到模型和效果都捆绑在一个 fed into foldp
的元组中。当你使用 StartApp
时,你将每个模型更新和信号绑定到那个单一的 foldp
,所以你保证没有竞争条件。