榆木,如何获取当前时间并将其发布到服务器

时间:2018-08-05 11:22:15

标签: time elm elm-architecture

根据this answerits 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

2 个答案:

答案 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
        }
相关问题