异步编程中for循环嵌套带来的问题和解决办法

3100阅读 0评论2014-03-24 ygfinsight
分类:JavaScript

情景:
    get()和set()是两个异步执行的函数,在for循环中我先get数据,然后set数据。
    如下代码会出现以下情况:

点击(此处)折叠或打开

  1. for(var i=1;i<=1000;++i){
  2.   var res = get("args"+i,function(err,data){
  3.       set("args"+i,data,function(err,result){});
  4.   })
  5. }
上面的代码会出现这种情况:当set函数执行时,i已经变成了1001,这是为什么呢?
个人理解:异步不等待,因为循环的效率高于异步,所以轮到set执行时,i已经变成了1001;
怎么解决呢?
思维当时比较愚蠢的竟然这样,服了我自己了,在此记下,以便日后鄙视自己一下:

点击(此处)折叠或打开

  1. for(var i=1;i<=1000;++i){
  2.   var res = get("args"+i,function(err,data){
  3.       for(var i=1;i<=1000;++i){
  4.             set("args"+i,data,function(err,result){});
  5.       }   
  6.   });
  7. }
这样是行了,可是set函数执行了1000*1000次,服了自己想出这样的办法。
经过改正又想到定义一个全局变量再set函数中不使用i

点击(此处)折叠或打开

  1. var j=1;
  2. for(var i=1;i<=1000;++i){
  3.   var res = get("args"+i,function(err,data){
  4.       set("args"+(j++),data,function(err,result){});
  5.   });
  6. }
这样是解决了,但是相当不完美,一是定义了一个全局变量总是不好的,另外难免有的人看到这个代码说i和j不是一样的吗?除非你注释上一句,谁去掉这个全局的j我和谁拼命。
于是又想到了这种方法:

点击(此处)折叠或打开

  1. for(var i=1;i<=1000;++i){
  2.  (function(idx){
  3.    var res = get("args"+idx,function(err,data)
  4.       set("args"+idx,data,function(err,result){}); 
  5.  });
  6.  })(i); 
  7. }
为了解决不在外部定义一个全局变量,使用匿名函数,这次匿名函数压根就没使用“全局”变量,相对来说好了许多。




上一篇:node.js源码研究(启动与模块加载)
下一篇:没有了