socket.io使用for循环添加socket.on方法(socket.io Using a fo

2019-10-17 08:15发布

假设

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

下面这是可能的,并让我发出的“测试”和“更新”和“测试”和“更新”将被调用

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

下面这些是不可能的......每一个将改为调用“测试”,如果我发出的“测试”或“更新”。 如果我使用一个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);
    });
}

线索:for循环使用“我”,有两个console.logs。 第二的console.log返回“2”

为什么会出现这种情况? 我怎么会用一个for循环附上我socketMethods?

Answer 1:

你使假设外部函数的变量在当时封闭“陷阱”的 创建它的常见错误。 事实并非如此。 这“陷阱”给外部函数的变量的引用 ,它的价值将是任何外部变量在执行关闭的时间。 如果您正在创建的环闭合,该值将是不管它曾在循环的结束。

要解决这个问题的方法是创建一个使用外部变量的值作为参数的“封闭”关闭。 要做到这一点的方法之一是创建生成您关闭一个辅助功能。 在你的第一个例子,你可以这样做

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

for(key in dummy.socketMethods){
  socket.on(key, makeOn(key));
}

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

它也可以使用一个立即函数调用(一些人称之为“自执行功能”)做同样的事情多了几分简洁,同时也少了几分可读。



文章来源: socket.io Using a for loop to add socket.on methods