Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript socket.io客户端能否在本地发出事件?_Javascript_Node.js_Angularjs_Socket.io - Fatal编程技术网

Javascript socket.io客户端能否在本地发出事件?

Javascript socket.io客户端能否在本地发出事件?,javascript,node.js,angularjs,socket.io,Javascript,Node.js,Angularjs,Socket.io,是否可以使用socket.io将事件发送到客户端而不发送到服务器?比如: socket.emitLocally('some event', data); 这就是我问的原因: 此时,我的服务器向所有套接字发出事件 io.sockets.emit() 虽然这很好,但在用户交互和服务器响应之间可能存在延迟 这就是为什么我更喜欢在服务器端使用广播,并在广播客户端立即处理事情 socket.broadcast.emit() 客户端基于angular.js,模块之间互不了解。我无法访问负责直接更新客

是否可以使用socket.io将事件发送到客户端而不发送到服务器?比如:

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

这就是我问的原因:

此时,我的服务器向所有套接字发出事件

io.sockets.emit()
虽然这很好,但在用户交互和服务器响应之间可能存在延迟

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

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

由于这基本上是我想知道我是否不能简单地使用他们的系统来做这件事


感谢您的任何意见或建议

假设您使用

io.on("name",callback);
你可以打个电话

callback();

我希望我能帮忙!=)

这可以按照socket.io client code on函数所示完成

事件保存在
套接字上。_回调
带有前缀
$
,因此例如
“connected”
将作为
“$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
}
//您可以使用内部事件(例如断开连接)或自定义事件(例如ChatMessage)。
var event=“MyEvent”;
//将args完全设置为socket.io服务器中的args。
//请注意,它们将在应用程序上使用,因此它们必须位于数组中。
var args=[1,2,3];
if(socket.\u回调){//如果套接字有回调
var callbacks=socket.\u callbacks['$'+事件];//加载回调事件
如果(回调){
callbacks=callbacks.slice(0);
for(var i=0,len=callbacks.length;i
在上面的示例中,将使用参数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('connection',函数(socket){
socket.on(“getSingleUpdate”,函数(id,数据){
警报(“事件#”+id+“数据”+数据);
});
函数emitLocalEvent(event/*、arg1、arg2等。*/){
if(socket.\u回调){
var args=[].slice.call(参数,1),
回调=套接字;
如果(回调){
callbacks=callbacks.slice(0);
for(var i=0,len=callbacks.length;i
那么,您希望客户端向自己发送消息,而不是向其他任何人发送消息吗?@jfriend00是的,但不实际发送消息(发送到服务器并返回)。我只想触发一个事件,如果一条消息被发送到客户端,该事件将被调度。这有意义吗?;)好的,我想我是按照你的要求来做的,但是我不知道socket.io中有什么功能可以做到这一点。我的示例有点太简单了。你当然是对的,在这样一个简单的例子中,我可以直接给听众打电话。我问这个问题的原因是,我使用socket.io作为集中式事件中心。因此,我永远无法确定应用程序的哪些部分将侦听它接收到的事件。在向服务器发送事件时调用所有侦听器可能会变得非常混乱,在某些情况下甚至不可能。因此,不幸的是,这并不能解决我的问题。TBH,我真的不明白如何让一个系统使用
io.on
从服务器接收消息,但您不知道回调是什么。您能再详细说明一下吗?我不知道使用
io.emit
时回调是什么。但我知道如果一切顺利,我的客户会收到什么样的事件。例如:angular应用程序有三个完全独立的模块:一个用于在每次添加消息时显示类似Toast的通知,一个用于在屏幕左侧列出聊天室以及未读消息计数,另一个用于在屏幕右侧列出所选聊天室的消息。(在下一条评论中继续…)(在上一条评论中继续…)所有这些模块都对新消息的事件感兴趣。他们都会收听
io.on(“新消息”,fn)
来修改他们在生命周期开始时下载的数据快照。-对于发送新消息的客户端,我希望这些更改是即时的(就在单击之后)。但是调用
io.emit
发送新消息的模块不可能知道其他模块的回调。请原谅,但我仍然不明白为什么您可能不知道回调是什么。您能添加一个小代码示例吗?