根据this answer和its helpful Ellie,我现在对如何获得Elm 0.18中的当前时间有了一个了解。
我想获取当前时间,然后以JSON格式发布到我的服务器。我已经有一个使用硬编码时间戳的POST,但我只是看不到如何获取当前时间,然后将其包含在我正在发布的JSON中。
我的猜测是我需要链接几个命令(获取当前时间,对服务器进行POST)。
[我也读过another SO,它显示了如何通过直接调用update
函数来连续运行一些命令,这听起来像是一个不错的主意,但我不确定是否我需要的是我的情况。]
为了解决这个问题,我想我会尝试解决一个类似的问题,我可以更轻松地在Ellie中进行设置。
在the original Ellie中获得当前时间,将其更新到模型中,然后视图功能将其显示。
在my version中,我希望这是一个分为两个步骤的过程,因此目前该模型已发展为Maybe Float
和一条String
消息。 view
函数显示消息字符串和一个按钮-计划是,当按下按钮时,它告诉运行时“获取当前时间,然后将其复制到消息插槽中”。
如果我可以解决这个问题,那么我觉得我可以解决我原来的问题。
我的Ellie尚未执行此操作。当您按下按钮时,时间已获得并被放入time
的{{1}}插槽中,但是我不知道如何告诉运行时'...现在将时间复制到消息槽”。 model
消息已经到位,但是我不知道如何在PutTimeInMessage
消息/命令之后运行它。
有什么建议吗?
到目前为止,这是我的代码(已编译),您可以run here in Ellie:
GetCurrentTime
答案 0 :(得分:2)
我的观察方式是,当收到message
消息时,您只需将time
字段与OnTime
字段一起更新即可。因此,整个update
函数将如下所示:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
OnTime t ->
( { model | time = Just t, message = toString t }, Cmd.none )
GetCurrentTime ->
( model, getTime )
在message
动作中设置了OnTime
,因为在GetCurrentTime
中时间是未知的,并且只有在执行getTime
函数和OnTime
消息之后才知道收到。
如果您仍想使用单独的操作来放置message
,则可以选择以下代码:
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
OnTime t ->
update PutTimeInMessage { model | time = Just t }
GetCurrentTime ->
( model, getTime )
PutTimeInMessage ->
case model.time of
Nothing ->
( model, Cmd.none )
Just t ->
( { model | message = toString t }, Cmd.none )
但是,老实说,最可取的解决方案是仅在视图中以不同的方式显示time
,因此您不需要message
字段(但可能我看不到整个图片):
view : Model -> Html Msg
view model =
div []
[ div []
[ button [ onClick GetCurrentTime ] [ Html.text "Get now time." ]
]
, viewTime model.time
]
viewTime : Maybe Float -> Html Msg
viewTime time =
case time of
Nothing -> Html.text "Empty message."
Just t -> Html.text (toString t)
答案 1 :(得分:1)
我遇到了一个SO which explained how to do a sequence of Http requests with Task.andThen
。因为我可以看到Time.now
的类型是Task
,所以我认为如果使用Http.toTask
,可以根据自己的目的修改该示例。
下面是我想出的解决方案,here it is in Ellie:
module Main exposing (..)
import Html exposing (..)
import Html.Events exposing (..)
import Http
import Json.Decode as JD
import Json.Encode as JE
import Task
import Time
type alias Model =
{ url : String
}
type Msg
= PostTimeToServer
| PostDone (Result Http.Error String)
update : Msg -> Model -> ( Model, Cmd Msg )
update msg model =
case msg of
PostTimeToServer ->
( model, postTimeToServer model.url )
PostDone _ ->
( model, Cmd.none )
view : Model -> Html Msg
view model =
div []
[ div []
[ button [ onClick PostTimeToServer ] [ Html.text "POST the current time." ]
]
]
postTimeToServer : String -> Cmd Msg
postTimeToServer url =
let
getTime =
Time.now
postTime t =
JD.string
|> Http.post url (JE.float t |> Http.jsonBody)
|> Http.toTask
request =
getTime <<-- Here is
|> Task.andThen postTime <<-- the key bit.
in
Task.attempt PostDone request
main =
Html.program
{ init = ( Model "url_here", Cmd.none )
, update = update
, view = view
, subscriptions = always Sub.none
}