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

    });

  })();

})

哈哈 完美解决~~

posted on 2016-09-22 16:17  慈方阳  阅读(314)  评论(0编辑  收藏  举报

导航