在JavaScript中使forEach异步

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)

我理解它为什么会发生,但不明白如何编写正确的代码.

pla*_*alx 5

问题是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)