我在使用socket.broadcast.emit()
向其他客户端广播时注意到了这种奇怪的行为
这是问题的示例代码:
...notifyOtherClients = function(room, e, data, socket)
{
// sending to all clients in a room except sender
var transport = socket.broadcast.to(room);
//
setTimeout(function(){
// #method1: this works as expected: all clients receive event except the sender
socket.broadcast.to(room).emit(e, data);
// #method2: this doesn't work though: all clients receive this event. Why?! Bug?
transport.emit(e, data);
// logs out 'true'
console.log(transport === socket.broadcast.to(room));
},
1000);
};
...
notifyOtherClients("myRoom", "someEvent", { }, socket);
我在这里错过了什么? 为什么#method2 没有按预期工作。
谢谢。
socket.broadcast.to(room)
的回报是什么?
@Mad-Head 根据文档,几乎像所有其他方法一样返回相同的套接字实例以保持可链接性。
http://socket.io/docs/server-api/#socket #to(room:string):socket
有趣的是,这是真实的
console.log(transport === socket.broadcast.to(room));
你好! socket.broadcast
实际添加一个临时标志(即, broadcast
),这将在下一次使用emit
被称为在socket
。
该标志第一次使用,然后被删除,因此是您第二次调用的结果。
你好呀! 嗯……可能我说的不够清楚。 让我说得更明显:
样本1
setTimeout(function(){
// #method1: this works as expected: all clients receive event except the sender
socket.broadcast.to(room).emit(e, data);
},
1000);
样本2
var transport = socket.broadcast.to(room);
setTimeout(function(){
// #method2: this doesn't work though: all clients receive this event. Why?! Bug?
transport.emit(e, data);
},
1000);
所以它与标志无关。 上面的两个示例应该工作相同,但他们没有。 这就是问题所在,我每天大约有 1/2 次撞墙以找出原因。
UPD:实际上@darrachequesne你是对的。 我查看了源代码:每次被称为 _rooms 时,都会被刷新,并且在 setTimeout 仍在进行中时出现了奇怪的问题,另一种方法称为 emit() 并刷新了房间(ping 是问题)
这就是发生的事情
1. setup a room with to()
2. start timeout for 1000 ms
...
[some where between 0 and 1000 ms] ping occurs i.e. emit() and flushes the room
...
3. timeout calls socket but the room's already flushed.
4. *problemo* all clients get notified including the sender socket.
非常感谢您的建议@darrachequesne。
关闭这个
最有用的评论
你好!
socket.broadcast
实际添加一个临时标志(即,broadcast
),这将在下一次使用emit
被称为在socket
。该标志第一次使用,然后被删除,因此是您第二次调用的结果。