Js如何遍历中异步使用key

最近有写到nodejs,在使用遍历的时候经常会出现一个常见的错误:

var loginModule = require('loginModule')

for (var key in loginModule) {

  socket.on(key, function (msg) {

    loginModule[key](socket, msg);

  });

})

 

loginModule.js的代码是:

module.exports = {

  regist: function (socket, msg){

    ...

  },

  login: function (socket, msg){

    ...

  }

}

 

如此执行上面的for循环后,想法是将module中的key和function都绑定起来,但是事与愿违,因为socket.on(key, fun)中的fun是一个委托,并不会在for循环中执行。

而但它执行的时候,根据js的闭包原理,它会在去拿上一层定义的key,但是这个key由于for循环的执行,已经变成了最后一个值,也就是login。

所以最终 regist其实也绑定到了login上。

 

理所当然的想,改成这样:

for (key in loginModule) {

  var k = key

  socket.on(k, function (msg) {

    loginModule[k](socket, msg);

  });

})

可是结果还是一样,因为这个K,也是会被多次赋值,最后取的时候,是最后一个值。

 

这种情况在编译语言中基本不会出现,比如我熟悉的c#~~

好吧,其实之前也多少遇到这个问题,一直不知道怎么办,网上因为问题不好描述,也一直没有查到答案~~

 

今天突然灵机一闪,想到了可以用一个function作为一个闭包~  如下:

for (var key in loginModule) {

  (function (){

    var k = key;  

    socket.on(k, function (msg) {

      loginModule[k](socket, msg);

    });

  })();

})

哈哈 完美解决~~

转载于:https://www.cnblogs.com/woasishen/p/5896856.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值