socket.io客户端是否可以在本地发出事件

Can the socket.io client emit events locally?

本文关键字:出事件 io 客户端 是否 socket      更新时间:2023-09-26

是否可以使用socket.io将事件调度到客户端而不发送到服务器?类似于:

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

以下是我询问的原因:

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

io.sockets.emit()

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

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

socket.broadcast.emit()

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

由于这基本上就是我现在用socket.io做的事情,我想知道我是否不能简单地使用他们的系统来做这件事。

感谢您的意见或建议!

这可以在函数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
}

在上面的示例中,将使用参数1、2、3调用"MyEvent"的回调。

关于如何在实际连接中使用此功能的另一个示例:

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]);
    });
});

假设您使用在客户端捕获事件

io.on("name",callback);

你可以直接打电话给

callback();

我希望我能帮忙