在javascript中返回不同范围之间的值

我是Javascript的新手,也是经验丰富的程序员,我正在努力地抓住最好的结构的模式和devise的概念,以build立应用程序时使用和方法。 一些领域对我来说相当新颖,一个是掌握Javascript的范围和closures。

所以为了让这个尽可能的干净,你们这些人,我已经附上了一个代码样本,希望有人可以把我的逻辑放在一个地方,给我一个指导思想和思考的权利。

我发布的代码是一个非常简单的文件系统/帮助程序库(Node.js,express)的一部分,用于扫描目录,在这些目录上运行一些条件,并返回结果作为地图维度数组到另一个库(不张贴)。 你看到的代码是我目前的“testing”条件。 我已经评论过了。

要点: https : //gist.github.com/jimmiehansson/6235613 (全视图或代码/库)

示例代码块(在返回值时出现问题)

ApiFS.prototype.scan = function(){ var self = this; var b; fs.readdir(stgs.fsPath, function(err,folders){ if(folders.length<1) { console.log(errLog.fsEmpty); return; } rslt = self.walk(folders); rslt.forEach(function(itm){ if(!self.exclusion(rslt)){ b=self.loader(stgs.fsPath,itm); } }); }, ioResponse); console.log(b); // undefined <---- } 

那么足够的破冰。 我最大的问题:

无论我做什么,范围(吊装)和相当小的封闭都妨碍我。 我目前不使用吸气剂或二聚物,因为我根本不知道该怎么做? 我的逻辑完全失效,还是缺less一些相当重要的东西?

在代码中,您将看到scan()原型函数对每个返回true / false值或数组的函数“helper”进行一次调用。

我可以简单地通过返回值到主扫描()函数,但我不能为我的生活从fs.readdir()函数返回的值返回范围外,例如ioResponsecallback之外。

什么是我的逻辑错过了,我怎么能更好地处理这个问题(即使这意味着重build每一件事情)我担心,我正在做一些非常错误的devise和布局这些函数的方法,以及如何处理它们之间的值。

任何援助非常感谢!

昆汀是正确的。 你一定要习惯节点程序的asynchronous性质。 只要说清楚,这应该像你期望的那样工作。

 ApiFS.prototype.scan = function(callback){ var self = this; var b; fs.readdir(stgs.fsPath, function(err, folders) { if(folders.length<1) { console.log(errLog.fsEmpty); return; } var results = []; async.each(folders, function(folder) { if(!self.exclusion(folder)) { results.push(self.loader(stgs.fsPath, itm)); } }, function() {}); if(typeof(callback) == "function") { callback(b); } }); } ApiFS.scan(function(files) { // Do something with files }); 

未经testing重要的重要

 var fs = require('fs'), async = require('async'), _ = require('underscore'), path = require('path'); ApiFS = function(options){ errLog = []; errLog.fsEmpty = "No existing directories or empty, cannot continue."; } ApiFS.prototype.scan = function(callback) { var self = this, results = {}; fs.readdir(options.fsPath, function(err, folders) { if(folders.length<1) return callback(errLog.fsEmpty); async.forEach(folders, function(folder) { if(!self.exclude(folder)) { self.loadFiles(folder, function(err, files) { results[folder] = files; }); }, function(err) { callback(err, results); }); }); } ApiFS.prototype.exclude = function(folder){ if(options.exclude.length === 0){ return false; } return _.contains(options.exclude, folder); } ApiFS.prototype.loadFiles = function(folder, callback) { fs.readdir(path.join(options.fsPath, folder), function(err, files) { callback(err, files); }); }; exports = module.exports = ApiFS; 

这与范围无关,而是关于时间。 readdir是asynchronous的。 它将请求发送到文件系统,然后让前一个function继续。

console.log(b); b=self.loader() 之前执行。

如果要使用callback函数中的数据,则需要在callback中执行该项工作。