【问题标题】:socket.io get socket inside a callbacksocket.io 在回调中获取套接字
【发布时间】:2015-06-17 22:01:04
【问题描述】:

我将 socket.io 用于 node.js。如果您添加这样的事件处理程序:

io = require('socket.io')(http);
io.on('connect',function(socket){
    socket.on('some event',function(arg1,arg2){
       /// using socket to emit events for example
    }
}

然后我可以在“某些事件”的回调中访问套接字 但是,如果我这样使用它会怎样

io = require('socket.io')(http);
io.on('connect',function){
    socket.on('some event',myfunction);
}

function myFunction(arg1,arg2)
{
    //I want to use calling socket here.
}

在后一种情况下如何访问套接字? 我需要套接字来获取 socket.id,这样我就可以知道是谁调用了这个事件。 谢谢

【问题讨论】:

    标签: javascript node.js socket.io web-deployment


    【解决方案1】:

    好吧,如果我明白你想要做什么,你可以简单地:

    io = require('socket.io')(http);
    io.on('connect',function){
        socket.on('some event',myfunction);
    }
    
    function myFunction(arg1,arg2)
    {
        var socketId = this.id; //here you go, you can refer the socket with "this"
    }
    

    这是我通常为保持代码整洁而做的事情:

    var on_potato = function(potatoData){
    
         var socket = this;
         var id = socket.id;
    
         //use potatoData and socket here
    };
    
    var on_tomato = function(tomatoData){
    
         var socket = this;
         var id = socket.id;
    
         //use tomatoData and socket here
    };
    
    var handleClientConnection = function (client) {
    
        client.on('potato', on_potato);
        client.on('tomato', on_tomato);
    };
    
    io.on('connection', handleClientConnection)
    

    【讨论】:

    • 回答how to use id to get socket back中缺少一部分
    • 哦等等 nvm 这是套接字
    • 最佳答案在这里
    【解决方案2】:

    好的,所以在讨论了这个之后,一个潜在的解决方案是从传递给 on 方法的匿名回调函数中调用您的命名函数。

    io.on('connect', function(socket){
    
     socket.on('someEvent', function(username, date){
    
        // If you emitted an object, you'll need to parse the incoming data. So say
        // You emitted {username: 'SomeName', date: 'SomeDate' }
        // You could just pass data.username and data.date directly
        // or put them into local variables, like:
        //var username = data.username, date = data.date;
    
        // Invoke your named function here and you can pass 
        // whatever you want to it, along with the socket
        myFunction(username, date, socket)
      })
    })
    
    myFunction(username, date, socket){
     // Do whatever you're doing with the passed paramaters
    }
    

    【讨论】:

    • 小调整,但我不认为套接字被传递到匿名函数中;如果你删除它,那么它将使用上面范围内的 socket 变量,而不是那里传递的任何东西。
    • 它不工作。用户名和日期在 socket.on('someEvent', function(){... 中未定义...它们从客户端页面传递到服务器。显然会出现复杂错误
    • 他们是通过socket.emit还是什么?这里需要注意的是,附加参数需要在可访问范围内可用。
    • 是的。这就是整个想法。服务器端库的用户可以传递自定义事件和回调,并从客户端网页发送这些带有参数的事件。
    • 我相信socket.io 在发送数据时会传递一个对象,因此您必须解析出参数并从那里传递它们。
    【解决方案3】:

    我经常使用 Lodash 的 partial 函数来解决此类问题(Underscore 也有一个,它做同样的事情)。基本上它所做的是创建一个新函数,其中填充了一些原始函数的参数。所以你会做的是这样的:

    io = require('socket.io')(http);
    io.on('connect', function(socket) {
      socket.on('some event', _.partial(myfunction, socket));
    });
    
    function myFunction(socket, ...args) {
      // whatever you wanna do
    }
    

    然后,当部分执行返回新的curried 函数时,它会将socket 预填充为第一个参数,您可以随意使用它。

    请注意,...args 只是您想放在那里的任何内容的占位符。另外,我不确定 socket.io 是否在触发回调时将任何内容传递给函数,这可能会影响参数在 curried 函数中的放置。如果 socket,不应该是第一个参数,你可以把它变成第二个:

    io = require('socket.io')(http);
    io.on('connect', function(socket)){
      socket.on('some event', _.partial(myfunction, _, socket));
    }
    
    function myFunction(arg1, socket, ...args) {
      // whatever you wanna do
    }
    

    【讨论】:

    • 如果您要投反对票,解释原因会很有帮助。除非你是小气,因为我指出你的答案不起作用。
    • _.partial 将在套接字对象传递给connect 事件之前至少被调用一次,这意味着socket 将导致函数抛出undefined 错误并且程序不会启动。
    • 对不起,这是来自 OP 的复制粘贴的拼写错误。套接字对象是从调用事件绑定的函数传入的。
    • partial 在 io 发出 'connect' 事件之后执行,在 socket 发出 'some event' 事件之前执行。 OP,这应该可行,我以前使用过这种技术。
    • 不,_.partial(myFunction, socket) 将在事件被触发之前被调用,因为它是一个函数调用。因为socket 根本没有定义,所以它会抛出一个错误。
    猜你喜欢
    • 2014-10-18
    • 1970-01-01
    • 1970-01-01
    • 2015-01-19
    • 2013-10-03
    • 2020-03-17
    • 2015-08-05
    • 2014-12-30
    • 1970-01-01
    相关资源
    最近更新 更多