【问题标题】:socket.io Using a for loop to add socket.on methodssocket.io 使用 for 循环添加 socket.on 方法
【发布时间】:2012-10-19 07:17:59
【问题描述】:

假设

socketMethods:{
    update:function(data){
        this.emit("test", data);
        console.log("socket.update");
    },
    test:function(data){
        this.emit("test", data);
        console.log("socket.test");
    }
}

以下是可能的,并且允许我发出“test”和“update”,并且将调用“test”和“update”

socket.on("test", function(data){
    dummy.socketMethods.test.call(socket, data);
});
socket.on("update", function(data){
    dummy.socketMethods.update.call(socket, data);
});

以下这些是不可能的......如果我发出“test”或“update”,每个人都会改为调用“test”。如果我使用 FOR 循环,所有方法都将成为调用的“最后一个”方法。

也就是说:如果我切换了更新和测试,那么在 socketMethods 对象中测试是第一,更新是第二。无论我要求“测试”还是“更新”,都会始终调用“更新”

for(key in dummy.socketMethods){
    socket.on(key, function(data){
        dummy.socketMethods[key].call(socket, data);
    });
}



var methods = ["test", "update"];
while(methods.length !== 0){
    var method = methods.pop();
    console.log(method);
    socket.on(method, function(data){
        dummy.socketMethods[method].call(socket, data);
    });
}



var methods = ["test", "update"];
for(var i = 0; i < methods.length; i++){
    console.log(i);
    socket.on(methods[i], function(data){
        console.log(i);
        dummy.socketMethods[methods[i]].call(socket, data);
    });
}

CLUE:使用'i'的for循环有两个console.logs。第二个 console.log 返回“2”

为什么会这样?以及如何使用 for 循环来附加我的 socketMethods?

【问题讨论】:

    标签: javascript node.js sockets socket.io


    【解决方案1】:

    您犯了一个常见的错误,即假设闭包在创建时“捕获”了外部函数变量的。它没有。它将引用“捕获”到外部函数的变量,其值将是在闭包执行时外部变量所具有的任何值。如果您在循环中创建闭包,则该值将是循环结束时的值。

    解决这个问题的方法是创建一个“封闭”闭包,它使用外部变量的值作为参数。一种方法是创建一个帮助函数来生成你的闭包。在您的第一个示例中,您可以这样做

    function makeOn(key) {
      return function(data) {
        dummy.socketMethods[key].call(socket, data);
      }
    }
    
    for(key in dummy.socketMethods){
      socket.on(key, makeOn(key));
    }
    

    现在在每个闭包中,key 将是一个新创建的变量(闭包之间不同)设置为适当的值。

    也可以使用立即函数调用(有些人称之为“自执行函数”)来更简洁地执行相同的操作,但可读性也有所降低。

    【讨论】:

    • 我想我什至无法-开始-表达由于这篇文章我要研究闭包的程度。这可以立即生效,甚至不必运行两次。
    猜你喜欢
    • 2019-10-09
    • 2014-01-24
    • 2019-11-15
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多