Sockets 具有二进制数据的Elm WebSocket

Sockets 具有二进制数据的Elm WebSocket,sockets,elm,Sockets,Elm,我需要使用带有二进制数据的套接字,因此我将Evan的库复制到了我的源代码中,并对本机代码进行了黑客攻击以进行读取 socket.addEventListener("message", function(event) { var reader = new FileReader(); console.log("** onmessage"); try { reader.readAsArrayBuffer(event.data)

我需要使用带有二进制数据的套接字,因此我将Evan的库复制到了我的源代码中,并对本机代码进行了黑客攻击以进行读取

 socket.addEventListener("message", function(event) {
        var reader = new FileReader();
        console.log("** onmessage");

        try {
            reader.readAsArrayBuffer(event.data);
        } catch (e) {
            console.error(e)
        }

        reader.addEventListener("loadend", function(event) {
            // ArrayBuffer
            let record = msgpack.decode(new Uint8Array(event.target.result));
            let recordString = JSON.stringify(record.NewRecords[0].Record);
            _elm_lang$core$Native_Scheduler.rawSpawn(A2(settings.onMessage, socket, recordString));
        });
    });
我有三个问题:

  • 我在Elm中得到的回调少于
    **onmessage
    日志
  • 对于较大的消息,我得到了我期望的
    **onmessage
    日志的一小部分
  • 我没有收到任何后续消息
首先,我认为我上面的闭包会在每次出现消息时生成一个新的filereader实例(事实上,我没有收到filereader忙的错误)。当我构建一些连接到端口的简单js套接字处理代码时,这样的代码工作得很好

对于第二种情况,套接字似乎完全失去了对消息的跟踪。我想知道使用
\u elm\u lang$core$Native\u Scheduler.rawsawn(A2(settings.onMessage,socket,recordString))是否有问题
在一个新的闭包中,导致
套接字的值出现某种竞争条件

更新
使用开发控制台,我可以看到第一次点击rawsawn行时,
socket.readyState==1
(打开),但之后,
socket.readyState==3
(即关闭)。我没有关闭它的任何代码。

文件阅读器是否在正确的位置创建了
对象?也许它应该在连接打开时创建,并在每条完整消息后归零。我认为这与套接字有关-请参阅我的更新