socket.io客户端可以在本地发出事件吗?

时间:2014-10-12 10:29:38

标签: javascript node.js angularjs socket.io

是否可以使用socket.io将事件分派给客户端而不将它们发送到服务器?类似的东西:

socket.emitLocally('some event', data);

这就是为什么我要问:

目前,我的服务器向所有套接字发送事件。

io.sockets.emit()

虽然效果很好,但用户交互和服务器响应之间可能存在延迟。

这就是为什么我更喜欢在服务器端使用广播并在广播客户端中立即处理事情。

socket.broadcast.emit()

客户端基于angular.js,模块彼此之间并不了解。我无法访问负责直接更新客户端的代码。我将不得不使用某种事件调度服务,我将注入相关模块。

由于这基本上是what I am doing with socket.io right now,我想知道我是否不能简单地使用他们的系统来做这件事。

感谢您提出任何意见或建议!

2 个答案:

答案 0 :(得分:1)

这可以在函数Emitter.prototype.emit上的socket.io客户端代码上显示。

事件保存在socket._callbacks上,前缀为$,因此例如"connected"位于_callbacks"$connected"

您可以使用以下方法复制所述函数的行为:

// You can use internal (e.g. disconnected) or custom events (e.g. ChatMessage).
var event = "MyEvent";
// Set your args exactly as in your socket.io server emit.
// Note that they will be used on an apply so they must be within an array.
var args = [1, 2, 3];

if(socket._callbacks) { // If the socket has callbacks
    var callbacks = socket._callbacks['$' + event]; // Load the callback event
    if (callbacks) {
        callbacks = callbacks.slice(0);
        for (var i = 0, len = callbacks.length; i < len; ++i)
          callbacks[i].apply(socket, args);
    } // Otherwise no calls
}

在上面的示例中,&#34; MyEvent&#34;的回调将使用参数1,2,3进行调用。

关于如何在实际连接上使用它的另一个例子:

io.on('connection', function (socket) {
    socket.on("getSingleUpdate", function(id, data){
        alert("Event #"+id+" data "+data);
    });

    function emitLocalEvent(event/*, arg1, arg2, etc.*/) {
        if(socket._callbacks) { 
            var args = [].slice.call(arguments, 1),
                callbacks = socket._callbacks['$' + event];
            if (callbacks) {
                callbacks = callbacks.slice(0);
                for (var i = 0, len = callbacks.length; i < len; ++i)
                  callbacks[i].apply(socket, args);
            }
        }
    }

    // Emitting fake events
    emitLocalEvent("getSingleUpdate", 1, "Hello");
    emitLocalEvent("getSingleUpdate", 2, "World!");

    // You can even receive an array of events via socket.io...
    socket.on("getMultipleEvents", function(eventArray) {
        for(var i in eventArray)
            emitLocalEvent.apply(null, eventArray[i]);
    });
});

答案 1 :(得分:0)

假设您使用

在客户端捕获事件
io.on("name",callback);

你可以打电话

callback();

我希望我能帮忙! =)