Elm 的时间不精确,是吗?
Elm's Time is not Precise, is it?
我一直在我的一个应用程序中玩弄 Effects.tick
和 Time
,我似乎无法让我的延迟达到它声称的 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 代码响应定时器信号引起的所有微小延迟的产物。
我一直在我的一个应用程序中玩弄 Effects.tick
和 Time
,我似乎无法让我的延迟达到它声称的 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 代码响应定时器信号引起的所有微小延迟的产物。