在回调函数中获取socket.io的socket对象

4

我正在使用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.on('some event',myfunction);
}

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

如何在后面的情况下访问socket? 我需要使用socket来获取socket.id,以便知道谁调用了此事件。 谢谢

3个回答

5
好的,如果我理解你想要做的事情,你可以简单地执行以下操作:

首先,你需要:

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)

如何使用ID获取套接字的返回部分缺失。 - Muhammad Umer
哦,等等,不好意思,这是套接字。 - Muhammad Umer
1
最佳答案在这里 - Muhammad Umer

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.on('someEvent', function(){...中,用户名和日期未定义。它们从客户端页面传递到服务器。显然出现了编译错误。 - Michael P
它们是通过 socket.emit 传递的吗?但需要注意的是,附加参数需要在可访问的范围内可用。 - Aweary
是的,那就是整个想法。服务器端库的用户可以传递自定义事件和回调,并从客户端网页发送带有参数的这些事件。 - Michael P
然后,您将它们作为参数添加到传递的匿名函数中(更新了我的帖子),然后它们将依次传递给次要命名函数。 - Aweary
1
我相信 socket.io 在发射数据时会传递一个单一的对象,因此您需要解析参数并从那里传递它们。 - Aweary
显示剩余5条评论

1
我经常使用 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在触发回调时是否会将任何内容传递到函数中,这可能会影响参数的放置顺序。如果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
}

如果你要点踩,解释一下为什么会很有帮助。除非你因为我指出你的答案不起作用而小气。 - mAAdhaTTah
在将socket对象传递给“connect”事件之前,至少会调用一次“_.partial”,这意味着“socket”将导致函数抛出“undefined”错误,程序将无法启动。 - Aweary
部分代码在io触发“connect”事件后执行,但在socket触发“some event”事件之前执行。OP,这应该可以工作,我以前使用过这种技术。 - mAAdhaTTah
不,_.partial(myFunction, socket)会在事件触发之前被调用,因为它是一个函数调用。它会抛出错误,因为根本没有定义socket - Aweary
自己试试。这里有一个快速的例子:https://gist.github.com/Aweary/cf1451e83fdf24f9e8d1。它使用了一个 HTTP 服务器,它就像 socket 一样是一个 EventEmitter - Aweary
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接