Chinaunix首页 | 论坛 | 博客
  • 博客访问: 331369
  • 博文数量: 73
  • 博客积分: 0
  • 博客等级: 民兵
  • 技术积分: 1293
  • 用 户 组: 普通用户
  • 注册时间: 2013-03-07 11:17
个人简介

爱运动,爱看书,爱生活!

文章分类

全部博文(73)

文章存档

2014年(7)

2013年(66)

分类: JavaScript

2014-03-24 19:15:54

情景:
    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. }
为了解决不在外部定义一个全局变量,使用匿名函数,这次匿名函数压根就没使用“全局”变量,相对来说好了许多。




阅读(3047) | 评论(0) | 转发(0) |
0

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

下一篇:没有了

给主人留下些什么吧!~~