node.js - nodejs异步编程变量传递的问题。

查看:189
本文介绍了node.js - nodejs异步编程变量传递的问题。的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

问 题

for(var i = 0; i < res.length;i++){
                
                var info = res[i];
                var fpath = attach_root_dir+'/'+picker_id+'/'+article_data._id+'/'+info.fileName;
                
                dlog(fpath);//位置1
                
                nodeRequire('fs').exists(fpath, function (exists) {
                    
                    dlog(fpath);//位置2
                });    
}                
                    

这段代码没贴全。
大致的作用就是从数据库里面循环读取附件列表,然后根据每个附件的信息,路径,去判断这个附件的文件是否存在。

现在的问题是,位置2得到的fpath变量永远都是同一个。
也就是说,外层的fpath无法正确的传递到位置2。因为异步执行的原因。如何解决这个问题呢?

解决方案

原因

你没有问原因不过我还是说一下原因吧。

fpath变量只是一个变量(引用),而你传递的回调函数只知道:哦,到时我可以去获得(引用)fpath的值。

关键在于你传递函数时,传递的只是一个未执行的函数,函数里有fpath这一个变量,由于未执行,并未获得当前值。

等异步函数要去获取的时候,fpath的值已经是最后一个了。

解法

假设问题为:

var a = [1,2,3,4,5,6,8]

for (var i = 0; i < a.length; i++) {
  var c = a[i]
  setTimeout(function(){
    console.info(c);
  }, 100)
}

解法一:(原始解法)
解法也很简单,上面说了当时的函数没有执行,我们可以创建一个函数执行一部分,用另外一个(新的函数的)变量存起来。

var a = [1,2,3,4,5,6,8]

for (var i = 0; i < a.length; i++) {
  var c = a[i]
  ;(function(c){
    setTimeout(function(){
      console.info(c);
    }, 100)
  })(c)
}

解法二:(es6解法)

var a = [1,2,3,4,5,6,8]

for (var i = 0; i < a.length; i++) {
  let c = a[i]
  setTimeout(function(){
    console.info(c);
  }, 100)
}

这篇关于node.js - nodejs异步编程变量传递的问题。的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆