2014-10-31 30 views
0

我构建的功能将自动扫描服务器启动或文件夹更改时的文件夹。该脚本将为已安装的小部件组装一个小部件文件夹,然后连接并构建一个新的部分文件以包含在前端应用程序中。Node.js中的未定义变量环状异步功能

脚本是这样的:这种方法被称为

concat.readMethodContents = function(concat) { 

    var widget; 
    for (widget in concat.widgets) { 

     var method; 
     for (method in concat.widgets[widget]) { 

      if (concat.widgets[widget][method].ready) { 
       concat.widgets[widget][method].ready = false; 

       fs.readFile('./lib/widgets/' + widget + '/methods/' + concat.widgets[widget][method].handle, 'utf8', function(err, data) { 
        if (err) { 
         console.log(err); 
        } else { 

         concat.widgets[widget][method].contents = data; 

         concat.writeJsPartialFile(concat); 
        } 
       }); 
      } 
     } 
    } 
} 

之前,CONCAT对象的样子:

{ 
    "widgets": { 
     "hello_world": [{ 
      "handle": "method1.js", 
      "ready": true 
     }, { 
      "handle": "method2.js", 
      "ready": true 
     }, { 
      "handle": "method3.js", 
      "ready": true 
     }] 
    } 
} 

与脚本的问题是,当方法被称为,它被定义为完成,因为循环已完成并且异步函数正在运行回调。

我该如何封装或以其他方式保留通过该操作部分的变量?

+0

欢迎来到承诺的土地。 – 2014-10-31 18:22:30

回答

1

我刚才已经回答这里此相同的问题:Accessing a MongoDB value from a query within a query

您使用自动执行功能来包装你关闭,以保证价值不,你的下面,由于循环改变。尝试像这样:

concat.readMethodContents = function(concat) { 
    var widget; 
    for (widget in concat.widgets) { 
     var method; 
     for (method in concat.widgets[widget]) { 
      (function(widgetMethod) { 
       if (widgetMethod.ready) { 
        widgetMethod.ready = false; 
        fs.readFile('./lib/widgets/' + widget + '/methods/' + widgetMethod.handle, 'utf8', function(err, data) { 
         if (err) { 
          console.log(err); 
         } else { 
          widgetMethod.contents = data; 
          concat.writeJsPartialFile(concat); 
         } 
        }); 
       } 
      })(concat.widgets[widget][method]); 
     } 
    } 
}