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,所以你保证没有竞争条件。