Socket.io: 除发件人问题外,向所有客户端广播

创建于 2016-06-22  ·  4评论  ·  资料来源: socketio/socket.io

我在使用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实际添加一个临时标志(即, broadcast ),这将在下一次使用emit被称为在socket

该标志第一次使用,然后被删除,因此是您第二次调用的结果。

所有4条评论

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。
关闭这个

此页面是否有帮助?
0 / 5 - 0 等级

相关问题

thebinarypenguin picture thebinarypenguin  ·  4评论

gCurtisCT picture gCurtisCT  ·  4评论

adammw picture adammw  ·  4评论

chfeizy picture chfeizy  ·  3评论

varHarrie picture varHarrie  ·  3评论