代码之家  ›  专栏  ›  技术社区  ›  John F. Miller

如何使websockets在Elm 0.19中工作

  •  7
  • John F. Miller  · 技术社区  · 7 年前

    elm-lang/websocket

    2 回复  |  直到 7 年前
        1
  •  6
  •   Matt    7 年前

    这个 websocket 包当前已针对Elm 0.19重新设计,请参见 this issue :

        2
  •  8
  •   Matt    7 年前

    下面是一个交互式表单的最小工作示例,该表单使用两个简单的输入/输出端口从echo.websocket.org回送输入,用于与elm 0.19模块外部的JavaScript websocket对象通信:

    文件:echo.elm。编译时使用: elm make echo.elm --output=echo.js

    port module Main exposing (main)
    
    import Browser
    import Html exposing (Html)
    import Html.Attributes as HA
    import Html.Events as HE
    import Json.Encode as JE
    
    -- JavaScript usage: app.ports.websocketIn.send(response);
    port websocketIn : (String -> msg) -> Sub msg
    -- JavaScript usage: app.ports.websocketOut.subscribe(handler);
    port websocketOut : String -> Cmd msg
    
    main = Browser.element
        { init = init
        , update = update
        , view = view
        , subscriptions = subscriptions
        }
    
    {- MODEL -}
    
    type alias Model =
        { responses : List String
        , input : String
        }
    
    init : () -> (Model, Cmd Msg)
    init _ =
        ( { responses = []
          , input = ""
          }
        , Cmd.none
        )
    
    {- UPDATE -}
    
    type Msg = Change String
        | Submit String
        | WebsocketIn String
    
    update : Msg -> Model -> (Model, Cmd Msg)
    update msg model =
      case msg of
        Change input ->
          ( { model | input = input }
          , Cmd.none
          )
        Submit value ->
          ( model
          , websocketOut value
          )
        WebsocketIn value ->
          ( { model | responses = value :: model.responses }
          , Cmd.none
          )
    
    {- SUBSCRIPTIONS -}
    
    subscriptions : Model -> Sub Msg
    subscriptions model =
        websocketIn WebsocketIn
    
    {- VIEW -}
    
    li : String -> Html Msg
    li string = Html.li [] [Html.text string]
    
    view : Model -> Html Msg
    view model = Html.div []
        --[ Html.form [HE.onSubmit (WebsocketIn model.input)] -- Short circuit to test without ports
        [ Html.form [HE.onSubmit (Submit model.input)]
          [ Html.input [HA.placeholder "Enter some text.", HA.value model.input, HE.onInput Change] []
          , model.responses |> List.map li |> Html.ol []
          ]
        ]
    

    将编译后的echo.js嵌入echo.html:

    <!DOCTYPE html>
    <html>
    <head>
      <meta charset="UTF-8">
      <title>Echo</title>
      <script src="echo.js"></script>
    </head>
    <body>
      <div id="elm-node"></div>
      <script>
        var app = Elm.Main.init({node: document.getElementById("elm-node")});
        var ws = new WebSocket("wss://echo.websocket.org");
        ws.onmessage = function(message)
        {
            console.log(message);
            app.ports.websocketIn.send(JSON.stringify({data:message.data,timeStamp:message.timeStamp}));
        };
        app.ports.websocketOut.subscribe(function(msg) { ws.send(msg); });
      </script>
    </body>
    </html>
    

    同样,这只是演示如何在Elm中使用带有WebSockets的端口的最小示例0.19分. 它不包括关闭WebSocket、错误处理等,但希望这个示例可以帮助您从这个方向开始。预计WebSockets将很快再次得到Elm的直接支持,所以这只是一个临时的工作。如果不需要升级到0.19分,然后考虑与0.18分相反。

    推荐文章