我正在尝试从一个套接字中侦听两个不同的事件; 两者都不起作用,只有第一个被发出才能听。
//server
_this.nsp.volatile.emit('event1', foo);
_this.nsp.volatile.emit('event2', bar);
//client
socket.on('event1', function(data){
//THIS ONE WORK
console.log("event1");
});
socket.on('event2', function(data){
//THIS ONE NOT
console.log("event2");
});
在此示例中,event1
将起作用,但event2
不起作用。
如果我首先发出event2
,event2
将有效,但不会event1
。
知道如何让它发挥作用吗?
答案 0 :(得分:1)
TL; DR:如果您想确保发送消息,请不要使用volatile
。
使用volatile
表示允许删除邮件。换句话说:您不能依赖于所有或以任何特定顺序交付它们。
我使用与此类似的代码进行了快速测试:
io.on('connection', (socket) => {
socket.volatile.emit('event1', '1');
socket.volatile.emit('event2', '2');
});
这两条消息都没有发送(无论如何,在我的设置中)。据我所知,调试输出的原因是服务器和客户端仍在协商发送消息时要使用的传输。因为它们是易失性的,所以一旦谈判完成,服务器就不会将它们排队以将它们发送出去。
在等待一段时间后发出消息时会发生类似的事情:
io.on('connection', (socket) => {
setTimeout(() => {
socket.volatile.emit('event1', '1');
socket.volatile.emit('event2', '2');
}, 2000);
});
此处收到第一条消息但第二条消息未收到(这似乎与您的情况相似)。调试日志显示:
socket.io:client writing packet {"type":2,"data":["event1","1"],"nsp":"/"} +1s
socket.io-parser encoding packet {"type":2,"data":["event1","1"],"nsp":"/"} +0ms
socket.io-parser encoded {"type":2,"data":["event1","1"],"nsp":"/"} as 2["event1","1"] +1ms
engine:socket sending packet "message" (2["event1","1"]) +0ms
engine:socket flushing buffer to transport +0ms
engine:ws writing "42["event1","1"]" +0ms
socket.io:client writing packet {"type":2,"data":["event2","2"],"nsp":"/"} +0ms
socket.io-parser encoding packet {"type":2,"data":["event2","2"],"nsp":"/"} +0ms
socket.io-parser encoded {"type":2,"data":["event2","2"],"nsp":"/"} as 2["event2","2"] +0ms
由此,我必须得出结论,第二条消息是编码的,但是没有被传递到处理实际通信的engine.io
部分。不过,它并没有说明原因。也许这是因为第一个事件仍然被发送出去,但这只是我的推测。