我已经在我的某个应用中使用Effects.tick
和Time
玩弄了,而我似乎无法将延迟放在Time.second
附近它声称是。它几乎是即时的。我理解type alias Time = Float
,而且从我的日志中可以看出second = 1000
,但即使是日志记录,这只会如此迅速地燃烧。对此有明确的解释吗?
答案 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的时间和计时器功能的薄外观。这种漂移仅仅是运行响应定时器信号的代码所造成的所有微小延迟的假象。