我需要使用带有二进制数据的套接字,因此我将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));
});
});
我有三个问题错误:
** onmessage
logs ** onmessage
日志的一小部分对于第一个,我认为上面的闭包会在每次有消息时创建一个新的文件读取器实例(事实上我没有得到关于文件读取器忙的错误)。当我构建一些连接到端口的简单js套接字处理代码时,这样的代码工作正常。
对于第二个,看起来套接字正在完全失去对消息的跟踪。我想知道在新的关闭中是否存在_elm_lang$core$Native_Scheduler.rawSpawn(A2(settings.onMessage, socket, recordString));
的问题,导致socket
的价值出现某种竞争条件?
更新
使用开发控制台我可以看到我第一次点击rawSpawn行socket.readyState == 1
(打开)但之后socket.readyState == 3
(即关闭)。我没有任何关闭它的代码。