gpt4 book ai didi

javascript - socket.io 使用 for 循环添加 socket.on 方法

转载 作者:行者123 更新时间:2023-11-30 08:56:46 25 4
gpt4 key购买 nike

假设

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

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

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

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

最佳答案

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

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

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

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

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

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

关于javascript - socket.io 使用 for 循环添加 socket.on 方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12969220/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com