我正在使用caolan's 'async' module打开一个文件名数组(在本例中为模板文件名)。
根据文档,我正在使用async.forEach(),因此我可以在所有操作完成后触发回调。
一个简单的测试案例是:
var async = require('async')
var fs = require('fs')
file_names = ['one','two','three'] // all these files actually exist
async.forEach(file_names,
function(file_name) {
console.log(file_name)
fs.readFile(file_name, function(error, data) {
if ( error) {
console.log('oh no file missing')
return error
} else {
console.log('woo '+file_name+' found')
}
})
}, function(error) {
if ( error) {
console.log('oh no errors!')
} else {
console.log('YAAAAAAY')
}
}
)
输出如下:
one
two
three
woo one found
woo two found
woo three found
即,似乎最终的回调没有解雇。我需要做什么才能使最终的回调发生火灾?
答案 0 :(得分:10)
正在所有项目上运行的函数必须进行回调,并将其结果传递给回调。请参阅下文(我还将fileName分开以提高可读性):
var async = require('async')
var fs = require('fs')
var fileNames= ['one','two','three']
// This callback was missing in the question.
var readAFile = function(fileName, callback) {
console.log(fileName)
fs.readFile(fileName, function(error, data) {
if ( error) {
console.log('oh no file missing')
return callback(error)
} else {
console.log('woo '+fileName+' found')
return callback()
}
})
}
async.forEach(fileNames, readAFile, function(error) {
if ( error) {
console.log('oh no errors!')
} else {
console.log('YAAAAAAY')
}
})
返回:
one
two
three
woo one found
woo two found
woo three found
YAAAAAAY
答案 1 :(得分:1)
在我看来,这是最好的方法。结果参数将包含一个包含文件数据的字符串数组,并且将并行读取所有文件。
var async = require('async')
fs = require('fs');
async.map(['one','two','three'], function(fname,cb) {
fs.readFile(fname, {encoding:'utf8'}, cb);
}, function(err,results) {
console.log(err ? err : results);
});