我有一个生成许多事件的socket.io服务器,我想捕获所有这些事件并打印类似的消息。现在,我这样做:
for (var event in {eventA: 1, eventB: 1, eventC: 1}) {
this.translationSocket.on(event, function(result) {
console.log("Server sent an event of type "+event);
});
}当服务器发送eventA、eventB和eventC时,我看到如下内容:
Server sent an event of type eventC
Server sent an event of type eventC
Server sent an event of type eventC也就是说,我的程序捕获所有事件,但总是显示eventC的类型.
我尝试了以下几种变体:
这些变化都不起作用..。
我该怎么办?
发布于 2013-05-02 11:27:47
这与socket.io或node.js无关,这是众所周知的JavaScript“怪癖”。event的值是在执行代码时计算的,这是循环完成时的值。您需要将其封装到函数调用中,以保留值。
var listen = function(socket, event) {
socket.on(event, function(result) {
console.log("Server sent an event of type "+event);
});
}
for (var event in {eventA: 1, eventB: 1, eventC: 1}) {
listen(event);
}或(较短版本):
for (var event in {eventA: 1, eventB: 1, eventC: 1}) {
(function(event) {
this.translationSocket.on(event, function(result) {
console.log("Server sent an event of type "+event);
});
})(event);
}发布于 2013-05-02 11:28:16
在for (var event in ...)中,您要声明一个变量,并且由于JavaScript中的变量范围规则,它在foreach循环之外是有效的。
event变量在循环结束时变成eventC。所以它是有价值的,当你想要打印时,它将是eventC。
你可以这样做:
function generateCallback(e, result) {
return function () {
console.log("Server sent an event of type " + e);
};
}
var e;
// ...
for (e in {eventA: 1, eventB: 1, eventC: 1}) {
this.translationSocket.on(e, generateCallback(e, result));
}为了防止混淆,最好不要在语句中声明变量。。
还有更好的,不要在循环中创建函数。这就是为什么我使用generateCallback而不是在循环中创建回调函数的原因。
发布于 2014-07-02 17:23:57
我会在npm上使用socket.io-events。您可以捕获所有事件并任意处理它们,而不必绑定单独的处理程序。
var io = require('socket.io')(3000);
var router = require('socket.io-events')();
router.on('*', function (sock, args, next) {
var name = args.shift(), msg = args.shift();
sock.emit('received event', name, msg);
});
io.use(router);https://stackoverflow.com/questions/16336687
复制相似问题