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

Time Elm,如何获取当前时间并将其发布到服务器,time,elm,elm-architecture,Time,Elm,Elm Architecture,根据,我现在知道了如何得到Elm 0.18中的当前时间 我想获取当前时间,然后用JSON将其发布到我的服务器上。我已经有一篇文章使用了硬编码的时间戳,但我不知道如何获取当前时间,然后将其包含在我发布的JSON中。 我的猜测是,我需要链接几个命令(获取当前时间,发布到服务器) [我还阅读了一篇文章,其中展示了如何通过直接调用update函数连续运行一些命令,这听起来是个不错的主意,但我不确定这是否是我的情况所需要的。] 实验([编辑]可能比预期的更分散注意力) 为了解决这个问题,我想我会尝试解决一

根据,我现在知道了如何得到Elm 0.18中的当前时间

我想获取当前时间,然后用JSON将其发布到我的服务器上。我已经有一篇文章使用了硬编码的时间戳,但我不知道如何获取当前时间,然后将其包含在我发布的JSON中。

我的猜测是,我需要链接几个命令(获取当前时间,发布到服务器)

[我还阅读了一篇文章,其中展示了如何通过直接调用
update
函数连续运行一些命令,这听起来是个不错的主意,但我不确定这是否是我的情况所需要的。]

实验([编辑]可能比预期的更分散注意力) 为了解决这个问题,我想我会尝试解决一个类似的问题,我可以更容易地在Ellie中设置

在当前时间内获取,更新到模型中,然后查看函数显示它

在本文中,我希望这是一个两步过程,因此将模型扩展为一个
Maybe Float
和一个
String
消息。
view
函数显示消息字符串和一个按钮——计划是当按下按钮时,它告诉运行时“获取当前时间,然后将其复制到消息槽中”

如果我能解决这个问题,那么我觉得我能解决我原来的问题

我的Ellie还没有这样做。当您按下按钮时,时间被获取并放入
模型
中的
时间
槽中,但我不知道如何告诉运行时“…现在将该时间复制到消息槽中”。
PutTimeInMessage
消息已经就位,但是我不知道如何在
GetCurrentTime
消息/命令之后运行它

有什么建议吗

以下是我的代码(已编译),您可以:


在我看来,当收到
OnTime
消息时,您可以将
message
字段与
time
字段一起更新。因此,整个
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 )
消息
是在
OnTime
操作中设置的,因为在
GetCurrentTime
中,时间是未知的,只有在执行
getTime
功能并接收到
OnTime
消息后才知道时间

如果仍要使用单独的操作来放置
消息
,则可选择以下代码:

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 )
但老实说,最好的解决方案是在视图中以不同的方式显示
时间
,因此您不需要
消息
字段(但我可能看不到整个画面):

我遇到了一个问题。因为我可以看到
时间的类型。现在
是一个
任务
,我想如果我使用
Http.toTask
,我可以根据我的目的调整这个例子

以下是我提出的解决方案:

模块主显示(…)
导入Html公开(…)
导入Html.Events公开(..)
导入Http
导入Json。解码为JD
导入Json.Encode为JE
导入任务
导入时间
类型别名模型=
{url:String
}
输入味精
=PostTimeToServer
|PostDone(结果Http.Error字符串)
更新:Msg->Model->(Model,Cmd-Msg)
更新msg模型=
味精案例
PostTimeToServer->
(模型,postTimeToServer model.url)
PostDone->
(型号,Cmd.none)
查看:模型->Html消息
视图模型=
分区[]
[部门[]
[按钮[单击PostTimeToServer][Html.text“发布当前时间”。]
]
]
postTimeToServer:String->Cmd Msg
postTimeToServer url=
让
盖蒂姆=
时间到了
加时t=
JD.string
|>Http.post url(JE.float t |>Http.jsonBody)
|>Http.toTask
请求=

getTime这个带有消息的示例是精心设计的,只是为了帮助我了解我真正想要解决的问题(获取时间,然后将其包含在一篇文章的JSON中)。我认为,您的第二段代码解决了这个问题:调用
update
就是我想要的。谢谢。伊戈尔,我很感谢你的回答,但经过一点努力,我发现它并没有解决我的问题。我可能用我的“实验性问题”分散了你的注意力,因为它实际上离我真正的问题“抓紧时间,把它放在帖子正文里”有点太远了。经过更多的工作,我发现
任务。然后
是适合我的解决方案。看看我的答案。
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 )
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)
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
        }