WebSockets 是异步的,因此尝试接收“下一条”消息不是正确的解决方案。可以同时在两个方向上发送多条消息。此外,Javascript 中的大多数操作都是由异步事件(超时触发或用户单击某物)触发的,这意味着您无法同步控制何时发送。此外,onmessage 处理程序是一个持久设置:一旦设置它,它就会接收所有消息,直到它被取消设置。您需要有某种方法来区分消息本身中的控制消息和数据消息。如果您需要将响应与发送的消息相关联,那么您还需要某种消息序列号(或其他形式的唯一消息 ID)。
例如,这会向服务器发送一条控制消息,并有一个消息处理程序可以区分控制和消息以及其他消息:
var nextSeqNum = 0;
...
msg = {id: nextSeqNum, mtype: "control", data: "some data"};
waitForMsg = nextSeqNum;
nextSeqNum += 1;
ws.send(JSON.stringify(msg));
...
ws.onmessage = function (e) {
msg = JSON.parse(e.data);
if (msg.mtype === "control") {
if (msg.id === waitForMsg) {
// We got a response to our message
} else {
// We got an async control message from the server
}
} else {
output(msg.data);
}
};