Created
May 12, 2012 21:47
-
-
Save Raynos/2669295 to your computer and use it in GitHub Desktop.
Iterate all the files
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var iterateFiles = require("iterateFiles"), | |
path = require("path") | |
// Load all files in the test folder or any of their sub folders | |
iterateFile(path.join(process.cwd(), "./test"), function (fileName) { | |
// run code for each recursively found js file | |
}, function (err) { | |
// run code when all files have been found recursively | |
}) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
var fs = require("fs"), | |
path = require("path"), | |
isJsFile = /.js$/ | |
function iterateFiles(uri, callback, done) { | |
var counter = 1 | |
fs.readdir(uri, errorProxy(done, readFiles)) | |
function readFiles(err, files) { | |
counter += files.length | |
files.forEach(isDirOrFile) | |
next() | |
} | |
function isDirOrFile(fileName) { | |
fileName = path.join(uri, fileName) | |
fs.stat(fileName, errorProxy(done, readOrRecurse)) | |
function readOrRecurse(err, stat) { | |
if (stat.isDirectory()) { | |
iterateFiles(fileName, callback, errorProxy(done, next)) | |
} else if (stat.isFile() && isJsFile.test(fileName)) { | |
callback(fileName) | |
next() | |
} else { | |
next() | |
} | |
} | |
} | |
function next() { | |
if (--counter === 0) { | |
done(null) | |
} | |
} | |
} | |
function errorProxy(errorHandler, callback) { | |
return proxy | |
function proxy(err) { | |
if (err) { | |
return errorHandler(err) | |
} | |
return callback.apply(this, arguments) | |
} | |
} |
Really not sure what's ideal in this situation.
Abort on error and call done callback with this error?
On line 30 you must check for an error passed to next.
Thanks, fixed the error handling to be better
Nice, two comments:
- I don't think you should hard code the regexp. What if people want to require coffee script files or whatever? Or maybe all files ending with
.run.js
. You could add an optionalregexp
parameter which defaults to the one you have hardcoded now when not supplied. - Wouldn't it be more descriptive to rename
error()
toerrorProxy()
? At first I didn't realize it was a proxy.
- People who want coffee can go die. Not adding complexity to the code for the sake of having flexibility on the regexp.
In that case you should rename iterateFiles
to iterateJSFiles
or whatever? Actually a much better argument is that people may want to iterate over non-js files, such as .txt files or whatever.
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
I think you should pass the error to the done callback, not the per file callback.