2

我有一个生成许多事件的 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的类型...

我尝试了以下变体:

  • 删除“for”中“event”之前的“var”:“for(event ...”
  • 添加语句 'var msg = "服务器发送了一个类型为 "+event;' 的事件;在“on”语句之前或在“console.log”语句之前,然后是“console.log(msg)”。

这些变化都不起作用......

我应该怎么办?

4

3 回答 3

1

这与 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-02T11:27:47.470 回答
1

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));
}

为防止混淆,您最好不要在 for 语句中声明变量

而且最好不要在循环中创建函数。这就是为什么我使用generateCallback而不是在循环中创建回调函数的原因。

于 2013-05-02T11:28:16.630 回答
0

我会socket.io-events在 npm 上使用。您可以捕获所有事件并根据需要处理它们,而无需绑定单独的处理程序。

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);
于 2014-07-02T17:23:57.020 回答