Effects.tick 替换榆树 0.17

Effects.tick replacement for elm 0.17

正如 the upgrade guide 中所述,Effects 正在被这个新的类似 Applicative Functor 的东西所取代 Cmd。我没有看到任何关于 Effects.tick 可能隐藏在哪里,或者如何重新实现它的线索。

从表面上看,Process.sleep 可能是正确答案,例如

Task.perform errorHandler (\x -> x) <| Process.sleep
                                    <| 500 * Time.millisecond

将允许进程在发出下一条消息/操作之前等待 500 毫秒。我只是不确定这是否会 替换 Effects.tick 在长 运行 中。

Effect.tick 功能被 AnimationFrame 取代。

你基本上订阅了一组时间或差异的消息。并做出相应反应。

import Html exposing (..)
import Html.App as App 
import AnimationFrame 
import Time exposing (Time, second)

main = 
  App.program 
    { init = Model 0 0 ! []
    , update = \msg model -> update msg model ! []
    , view = view 
    , subscriptions = \_ -> AnimationFrame.diffs identity}

type alias Model = 
  { timeSinceLastIncrement : Time 
  , counter : Int }

incrementTime = 1*second

update diff {timeSinceLastIncrement, counter} = 
  if timeSinceLastIncrement > incrementTime then 
    Model 0 (counter+1)
  else
    Model (timeSinceLastIncrement+diff) counter

view {counter} = 
  div [] [text (toString counter)] 

我选择直接将时间差异作为消息发送,并在 updateview 中解压模型结构,以便更轻松地访问组件。在更复杂的应用程序中,您可能会收到类似 Tick Time 的消息。