已调用节点异步瀑布回调
Node async waterfall callback was already called
我正在尝试使用 async.waterfall 从目录中读取一些文件,在我看来我做的事情是正确的,但是我得到了指定的错误并且从未调用过 readData 函数。怎么了?
var fs = require("fs");
var async = require("async");
var folder = "./files/";
try {
async.waterfall([
function readDir(cb) {
fs.readdir(folder, function(err, files) {
cb(err, files);
});
},
function loopFiles(files, cb) {
files.forEach(function(fn) {
console.log("loop " + fn);
cb(null, fn);
});
},
function check(fn, cb) {
console.log("check "+fn);
fs.stat(folder + fn, function(err, stats) {
console.log(stats.isFile());
cb(err, stats, fn);
});
},
function readData(stats, fn, cb) {
console.log("read "+fn);
if (stats.isFile()) {
fs.readFile(folder + fn, "utf-8", function(err, data) {
cb(err, data);
});
}
}
], function(err, result) {
if (err) {
throw err;
}
console.log(result);
});
} catch (err) {
console.log(err);
}
问题是如果 files.length > 1
,您在 loopFiles()
中多次调用 cb(null, fn)
。您可能需要对每个文件执行单独的 async.waterfall()
或使用其他一些 async.*
方法。
另一个问题是在 readData()
中,在 stats.isFile()
计算结果为 false
的情况下,您没有调用 cb()
。
我正在尝试使用 async.waterfall 从目录中读取一些文件,在我看来我做的事情是正确的,但是我得到了指定的错误并且从未调用过 readData 函数。怎么了?
var fs = require("fs");
var async = require("async");
var folder = "./files/";
try {
async.waterfall([
function readDir(cb) {
fs.readdir(folder, function(err, files) {
cb(err, files);
});
},
function loopFiles(files, cb) {
files.forEach(function(fn) {
console.log("loop " + fn);
cb(null, fn);
});
},
function check(fn, cb) {
console.log("check "+fn);
fs.stat(folder + fn, function(err, stats) {
console.log(stats.isFile());
cb(err, stats, fn);
});
},
function readData(stats, fn, cb) {
console.log("read "+fn);
if (stats.isFile()) {
fs.readFile(folder + fn, "utf-8", function(err, data) {
cb(err, data);
});
}
}
], function(err, result) {
if (err) {
throw err;
}
console.log(result);
});
} catch (err) {
console.log(err);
}
问题是如果 files.length > 1
,您在 loopFiles()
中多次调用 cb(null, fn)
。您可能需要对每个文件执行单独的 async.waterfall()
或使用其他一些 async.*
方法。
另一个问题是在 readData()
中,在 stats.isFile()
计算结果为 false
的情况下,您没有调用 cb()
。