Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.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 io在回调中获取套接字_Javascript_Node.js_Socket.io_Web Deployment - Fatal编程技术网

Javascript io在回调中获取套接字

Javascript io在回调中获取套接字,javascript,node.js,socket.io,web-deployment,Javascript,Node.js,Socket.io,Web Deployment,我正在为node.js使用socket.io。如果添加这样的事件处理程序: 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.o

我正在为node.js使用socket.io。如果添加这样的事件处理程序:

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) {
  socket.on('some event', _.partial(myfunction, socket));
});

function myFunction(socket, ...args) {
  // whatever you wanna do
}
然后我可以访问回调函数中的some事件套接字 但是,如果我这样使用它呢

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,以便知道是谁调用了此事件。 谢谢

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

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) {
  socket.on('some event', _.partial(myfunction, socket));
});

function myFunction(socket, ...args) {
  // whatever you wanna do
}
然后,当新函数从部分执行返回时,它的
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
}

好的,在讨论了这一点之后,一个潜在的解决方案是从传递给
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
}

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

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)

如果你要投否决票,解释一下原因会很有帮助。除非你因为我指出你的答案不起作用而显得小气。
在套接字对象传递给
connect
事件之前,至少会调用一次partial
,这意味着
socket
将导致函数抛出
未定义的
错误,程序将无法启动。抱歉,这是复制粘贴操作中的一个输入错误。套接字对象是从调用事件绑定的函数传入的。在io发出“connect”事件后,在套接字发出“some event”事件之前,执行partial。哎呀,这应该行得通,我以前用过这种技术。不,
将在触发事件之前被调用,因为它是函数调用。它将抛出一个错误,因为根本没有定义
socket
;如果您删除它,那么它将使用上述范围中的
socket
变量,而不是在其中传递的任何内容。它不起作用。套接字中未定义用户名和日期。on('someEvent',function()){…它们是从客户端页面传递到服务器的。显然,它们是通过
socket.emit
还是什么传递的?这里的警告是,附加参数需要在可访问的范围内可用。是的。这就是全部想法。服务器端库的用户可以通过自定义e我相信,
socket.io
在发送数据时只传递一个对象,所以你必须解析出参数并从那里传递它们。答案中缺少一个部分如何使用id获取socket回来哦,等等,nvm这是socket最好的答案