Elm 的时间不精确,是吗?

Elm's Time is not Precise, is it?

我一直在我的一个应用程序中玩弄 Effects.tickTime,我似乎无法让我的延迟达到它声称的 Time.second成为。这几乎是立竿见影的。我知道 type alias Time = Float,从我的日志来看似乎是 second = 1000,但这燃烧得如此之快,即使有日志记录也是如此。对此有明确的解释吗?

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

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

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

每个 update 调用都会请求一个新的价格变动,因此它将永远旋转。重要的是 tickEverySecond 仅在上次更新时间大于一秒前才更新。

你问的是时间精度。如果你 运行 这个例子,你会注意到每秒的增量有点近似;它会漂移超过一秒。这不是由于任何潜在的不精确。请记住,Elm 的 Time 功能只是 Javascript 的时间和计时器功能的薄薄一层。这种漂移只是由 运行ning 代码响应定时器信号引起的所有微小延迟的产物。