榆树的时间不精确,是吗?

时间:2016-04-21 01:36:13

标签: time floating-point elm

我已经在我的某个应用中使用Effects.tickTime玩弄了,而我似乎无法将延迟放在Time.second附近它声称是。它几乎是即时的。我理解type alias Time = Float,而且从我的日志中可以看出second = 1000,但即使是日志记录,这只会如此迅速地燃烧。对此有明确的解释吗?

1 个答案:

答案 0 :(得分:2)

Effects.tick导致几乎瞬间调用一个动作,但被调用的动作会传递一个当前时刻的值。如果你想在使用Effects.tick时延迟一秒,你必须跟踪起点并将其与当前刻度的时间进行比较,这就是你可以在{{1}添加的地方}。

采取这个任意的例子(你可以把它粘贴到http://elm-lang.org/try):

Time.second

每个import Html exposing (..) import Html.Events exposing (..) import Html.Attributes exposing (..) import StartApp import Effects exposing (Never) import Task import Signal import Time exposing (..) app = StartApp.start { init = init , view = view , update = update , inputs = [ ] } main = app.html type alias Model = { lastTick : Maybe Time , tickEverySecond : Maybe Time } init = ({ lastTick = Nothing, tickEverySecond = Nothing }, Effects.tick MyTicker) view address model = div [] [ div [] [ text <| "Current tick: " ++ (toString model.lastTick) ] , div [] [ text <| "Updated every second: " ++ (toString model.tickEverySecond) ] ] type Action = MyTicker Time update action model = let everySecond = Maybe.withDefault 0 model.tickEverySecond getTickEverySecond time = if time > everySecond + Time.second then Just time else Just everySecond in case action of MyTicker time -> ( { model | lastTick = Just time , tickEverySecond = getTickEverySecond time }, Effects.tick MyTicker) port tasks : Signal (Task.Task Never ()) port tasks = app.tasks 调用都会请求一个新的tick,因此它将永远旋转。重要的一点是update只有在上次更新时才会更新大于一秒钟。

你问时间精度。如果你运行那个例子,你会注意到每秒的增量有些近似;它将漂移超过一秒钟。这不是由于任何潜在的不精确。请记住,Elm的tickEverySecond功能是Javascript的时间和计时器功能的薄外观。这种漂移仅仅是运行响应定时器信号的代码所造成的所有微小延迟的假象。