2017-03-26 8 views
0

私が次のコードに期待したのは、タイマーのオンとオフを切り替えると非同期にカウントを増加させることです。しかし、常に同期して動作します(2刻み)。すぐにElmでタイマーを開始

どのように非同期にすることができますか?

EDIT:私の英語能力が不足している可能性がありますが、問題はよく誤解されているようです。私は私の答えとまったく同じ振る舞いをする実装をしたい。そしてポイントは、です.2つのタイマーは、トグルすることによってカウントを別々に増やすべきです。

import Html exposing (program, div, button, text) 
import Html.Events exposing (onClick) 
import Time exposing (every, second) 

main = program 
    { init = ({cnt = 0, on = True}, Cmd.none) 
    , view = view 
    , update = update 
    , subscriptions = subscriptions 
    } 

subscriptions model = Sub.batch 
    [ every second (always Increment) 
    , if model.on then every second (always Increment) else Sub.none 
    ] 

view model = div [] 
    [ button [ onClick Toggle ] [ text "-" ] 
    , div [] [ text (toString model) ] 
    , button [ onClick Increment ] [ text "+" ] 
    ] 

type Msg = Increment | Toggle 

update msg model = 
    case msg of 
    Increment -> 
     ({model | cnt = model.cnt + 1}, Cmd.none) 
    Toggle -> 
     ({model | on = not model.on}, Cmd.none) 
+0

ずつ増加できます、1 2:あなたは出力が可能に表示期待、3、4のいずれかである。 model.onは、トグルが実際に起こったときに基づいて、ディスプレイが変化する速度にのみ影響する必要があります。 しかし、問題は、model.onがTrueの場合、1,3,5と表示されます。1,2,3,4,5の代わりに、以前とは異なる速度で表示されます。 私はあなたの質問を正しく理解しているかどうか教えてください。 – Jigar

+0

@ Jigarはい。それが私の言いたいことです。 – jeiea

答えて

0

この問題にハック以下であるが、それはもちろん望ましいことではないでしょう。私は可能な限り他のソリューションを使いたい。信頼できる方法を私に提供してください。

import Html exposing (program, div, button, text) 
import Html.Events exposing (onClick) 
import Time exposing (every, second) 

main = program 
    { init = ({cnt = 0, on = True}, Cmd.none) 
    , view = view 
    , update = update 
    , subscriptions = subscriptions 
    } 

subscriptions model = Sub.batch 
    [ every (second + 0.0000000001) (always Increment) 
    , if model.on then every second (always Increment) else Sub.none 
    ] 

view model = div [] 
    [ button [ onClick Toggle ] [ text "-" ] 
    , div [] [ text (toString model) ] 
    , button [ onClick Increment ] [ text "+" ] 
    ] 

type Msg = Increment | Toggle 

update msg model = 
    case msg of 
    Increment -> 
     ({model | cnt = model.cnt + 1}, Cmd.none) 
    Toggle -> 
     ({model | on = not model.on}, Cmd.none) 
0

ここonながら毎秒1カウントアップバージョンだ、と常に手動で明瞭にするために1

import Html exposing (program, div, button, text) 
import Html.Events exposing (onClick) 
import Time exposing (every, second) 

main = program 
    { init = ({cnt = 0, on = True}, Cmd.none) 
    , view = view 
    , update = update 
    , subscriptions = subscriptions 
    } 

subscriptions model = Sub.batch 
    [ every second (always Tick) 
    ] 

view model = div [] 
    [ button [ onClick Toggle ] [ text "Toggle" ] 
    , div [] [ text (toString model) ] 
    , button [ onClick Increment ] [ text "+" ] 
    ] 

type Msg = Tick | Toggle | Increment 

update msg model = 
    case msg of 
    Increment -> 
     ({model | cnt = model.cnt + 1}, Cmd.none) 

    Tick -> 
     case model.on of 
     True -> 
      ({model | cnt = model.cnt + 1}, Cmd.none) 
     False -> 
      (model, Cmd.none) 

    Toggle -> 
     ({model | on = not model.on}, Cmd.none) 
+0

私は私の質問に追加の説明を加えました。あなたのような答えがありました。 – jeiea

関連する問題