ine*_*bug 2 javascript foreach asynchronous node.js
我正在尝试理解异步编程Node.js但在此代码上停滞不前.
它们的回调中的这个函数返回一个目录中的文件数组:
function openDir(path, callback) {
path = __dirname + path;
fs.exists(path, function (exists) {
if (exists) {
fs.readdir(path, function (err, files) {
if (err) {
throw err;
}
var result = [];
files.forEach(function (filename, index) {
result[index] = filename;
});
return callback(result);
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
但是当我在里面使用异步代码时.forEach,它什么都不返回:
function openDir(path, callback) {
path = __dirname + path;
fs.exists(path, function (exists) {
if (exists) {
fs.readdir(path, function (err, files) {
if (err) {
throw err;
}
var result = [];
files.forEach(function (filename, index) {
fs.stat(path + filename, function (err, stats) {
if (err) {
throw err;
}
result[index] = filename;
});
});
return callback(result);
});
}
});
}
Run Code Online (Sandbox Code Playgroud)
我理解它为什么会发生,但不明白如何编写正确的代码.
问题是fs.stat也是异步,但你可能会做类似的事情:
var result = [],
expectedLoadCount = files.length,
loadCount = 0;
files.forEach(function (filename, index) {
fs.stat(path + filename, function (err, stats) {
if (err) {
throw err;
}
result[index] = filename;
if (++loadCount === expectedLoadCount) callback(result);
});
});
Run Code Online (Sandbox Code Playgroud)