首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >知道事件名称的事件处理程序

知道事件名称的事件处理程序
EN

Stack Overflow用户
提问于 2013-05-02 11:16:46
回答 3查看 176关注 0票数 2

我有一个生成许多事件的socket.io服务器,我想捕获所有这些事件并打印类似的消息。现在,我这样做:

代码语言:javascript
复制
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时,我看到如下内容:

代码语言:javascript
复制
Server sent an event of type eventC
Server sent an event of type eventC
Server sent an event of type eventC

也就是说,我的程序捕获所有事件,但总是显示eventC的类型.

我尝试了以下几种变体:

  • 删除"for":"for“(事件.)中”事件“之前的"var”。
  • 添加一个语句'var msg = "Server发送一个类型为“+ event”的事件;'on‘语句之前或'console.log’语句之前的'console.log(msg)‘。

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

我该怎么办?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-05-02 11:27:47

这与socket.io或node.js无关,这是众所周知的JavaScript“怪癖”。event的值是在执行代码时计算的,这是循环完成时的值。您需要将其封装到函数调用中,以保留值。

代码语言:javascript
复制
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);
}

或(较短版本):

代码语言:javascript
复制
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);
}
票数 1
EN

Stack Overflow用户

发布于 2013-05-02 11:28:16

for (var event in ...)中,您要声明一个变量,并且由于JavaScript中的变量范围规则,它在foreach循环之外是有效的。

event变量在循环结束时变成eventC。所以它是有价值的,当你想要打印时,它将是eventC

你可以这样做:

代码语言:javascript
复制
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而不是在循环中创建回调函数的原因。

票数 1
EN

Stack Overflow用户

发布于 2014-07-02 17:23:57

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

代码语言:javascript
复制
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);
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16336687

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档