如何使WebSocket在Elm 0.19中工作

如何使WebSocket在Elm 0.19中工作,websocket,elm,Websocket,Elm,我正在尝试从Elm的0.18版升级到0.19版。我的项目依赖于0.18中的elm lang/websocket?我似乎无法在0.19中找到等效的包。我遗漏了什么?目前已为Elm 0.19重新设计了websocket包,请参见: 此软件包尚未更新为0.19。我听到很多人说他们需要这个软件包的更多功能,所以我宁愿在更新中考虑到这一点,而不是仅仅做同样的事情。我建议使用端口或0.18,如果您现在绝对需要这样做 编辑:2020年4月15日更新 软件包已存档,文件已更新为 如下: 目前推荐的将WebSoc

我正在尝试从Elm的0.18版升级到0.19版。我的项目依赖于0.18中的
elm lang/websocket
?我似乎无法在0.19中找到等效的包。我遗漏了什么?

目前已为Elm 0.19重新设计了
websocket
包,请参见:

此软件包尚未更新为0.19。我听到很多人说他们需要这个软件包的更多功能,所以我宁愿在更新中考虑到这一点,而不是仅仅做同样的事情。我建议使用端口或0.18,如果您现在绝对需要这样做

编辑:2020年4月15日更新

软件包已存档,文件已更新为 如下:

目前推荐的将WebSocket与Elm结合使用的方法是 港口。您可以在[IMAGE CLIPPED]中看到一个最小的示例

历史

我们在Elm的版本中有一个WebSockets的裸体版本 0.17和0.18,介绍Elm订阅的一部分。但是用户发现API不能覆盖很多情况 他们在实践中遇到了困难。这怎么能与长生不老药凤凰一起使用呢? 火基?如何使用不同的退避策略重新连接? 我如何得知连接何时中断或恢复?怎么 关于子协议

在试图扩展API以涵盖人们面临的所有情况时 在实践中,我开始认为这可能是不可能的 当前订阅基础结构。(我的感觉就是这样 管理器可能不太适合web套接字,因为它们不适合 有很好的机制来唯一地识别资源。我们有吗 一个或两个连接?我们如何区分差异?如果需要 函数指针相等,当 是否使用匿名函数?)我也不理解这个问题 2016年,我认为这一点在web套接字中表现得最为明显

因此,面对(1)拥有如此多API的前景 最终不得不留在港口或(2)建议 人们从一开始就使用端口,我们认为(2)可能是 对刚到榆树来的人来说是最好的。这样他们就可以和 他们首选的web套接字管理器不需要中间步骤 学习一个有前途但不完整的API


下面是一个交互式表单的最小工作示例,它使用两个简单的输入/输出端口从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>

回音
var app=Elm.Main.init({node:document.getElementById(“Elm node”)});
var ws=新的WebSocket(“wss://echo.websocket.org");
ws.onmessage=函数(消息)
{
控制台日志(消息);
send(JSON.stringify({data:message.data,timeStamp:message.timeStamp}));
};
订阅(函数(msg){ws.send(msg);});
这可以在Linux上的Firefox 60.2.0esr上运行,但尚未在其他平台上进行测试


同样,这只是演示如何在Elm 0.19的WebSocket中使用端口的一个最小示例。它不包括关闭WebSocket、错误处理等,但希望这个示例可以帮助您从这个方向开始。预计WebSocket不久将再次直接由Elm支持,因此这只是一个临时解决方案。如果你不需要升级到0.19,那么考虑用0.18来代替。

我不同意这只是暂时的解决方法。我试过了,它要复杂得多,而且似乎还在进行中。另一方面,你的解决方案很简单,而且很有效。