2016-04-21 97 views
2

我一直在Effects.tickTime在我的一個應用程序玩弄,我似乎無法得到我的延遲,它在Time.second它聲稱是。這幾乎是直接的。據我所知,type alias Time = Float,並從我的日誌看起來好像是second = 1000,但即使在記錄的情況下,它也會很快燃燒。對此有明確的解釋嗎?榆樹的時間不準確,是嗎?

回答

2

Effects.tick導致某個動作幾乎是瞬間被調用,但被調用的動作會傳遞一個當前刻度值的值。如果您想在使用Effects.tick時延遲一秒鐘,則必須跟蹤起點並將其與當前時間點的時間進行比較,這就是您可以在Time.second中添加的位置。

拿這個任意例子(你可以將其粘貼到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只在最後一次更新時間大於1秒前更新。

你問的時間精度。如果你運行這個例子,你會注意到每秒的增量有些近似;它會漂移超過一秒鐘。這不是由於任何潛在的不精確。請記住,Elm的Time功能是基於Javascript時間和計時器功能的薄單板。該漂移僅僅是由響應定時器信號的運行代碼引起的所有微小延遲的人造物。