[英]socket.io get socket inside a callback
我正在使用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
}
}
然后我可以在'some event'的回调中访问socket但是如果我像这样使用它
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.id所以我可以知道谁调用了这个事件。 谢谢
好吧,如果我明白你想做什么,你可以简单地说:
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)
好吧,所以在讨论之后,一个潜在的解决方案就是从传递给on
方法的anoymous回调函数中调用你的命名函数。
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
}
我经常使用Lodash的部分功能来解决这样的问题( 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
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.