Javascript 为什么这个fs.readFile循环没有将其结果推送到我的数组中?

Javascript 为什么这个fs.readFile循环没有将其结果推送到我的数组中?,javascript,node.js,fs,Javascript,Node.js,Fs,但是最后的结果是一个空数组:[] 为什么我做错了?您必须等待查看结果,直到最后一次fs.readFile()操作完成。这些是异步操作,它们将在将来完成。你在检查结果之前,他们中的任何一个还没有完成 解决此问题的方法有很多,但此方法可能会对代码造成最少的更改,因为它只保留一个计数器,指示完成了多少: <p>File 1</p> <p>File 2</p> 我个人更喜欢使用promises和Promise.all()来解决这个问题 下面是一个使用

但是最后的
结果是一个空数组:
[]


为什么我做错了?

您必须等待查看结果,直到最后一次
fs.readFile()
操作完成。这些是异步操作,它们将在将来完成。你在检查结果之前,他们中的任何一个还没有完成

解决此问题的方法有很多,但此方法可能会对代码造成最少的更改,因为它只保留一个计数器,指示完成了多少:

<p>File 1</p>

<p>File 2</p>

我个人更喜欢使用promises和
Promise.all()
来解决这个问题

下面是一个使用Bluebird promise库的版本,它保留了一些其他结构:

function parseHTML(files, callback) {
    var result = [],
        cntr = 0;

    files.forEach(function(file) {
        if (file.match(/\.html$/)) {
            fs.readFile(file, 'utf8', function(err, data) {
                if (err) throw err
                result.push(data)
                    // see if we're done processing all the results
                    ++cntr;
                if (cntr === files.length) {
                    callback(null, result);
                }
            });
        } else {
            ++cntr;
            if (cntr === files.length) {
                callback(null, result);
            }
        }
    });
}

这里有一个完全承诺的版本:

var Promise = require("bluebird");
var fs = Promise.promisifyAll(require('fs'));

// your other code here

function parseHTML(files, callback) {
    var promises = [];

    files.forEach(function(file) {
        if (file.match(/\.html$/)) {
            promises.push(fs.readFileAsync(file, 'utf8'));
    });
    Promise.all(promises).then(function(results) {
        // all results in results array
        callback(null, results);
    }, function(err) {
       // error here
    });
}

嘿,我正在研究的代码在哪里,哈。@alexchenco-它回来了。我意识到这是错误的,所以暂时将其回滚。谢谢!哇,我没想到让代码等待某个任务会如此复杂。@alexchenco-如果你要在node.js中编程,你需要非常熟悉稍后完成的异步操作。node.js不等待异步操作。主线代码继续执行,异步操作在一段时间后完成。如果您想在异步操作完成的基础上协调一些操作,那么必须编写特殊的代码来完成。你可能会想学习承诺,因为它们提供了很多工具。您正在使用的异步库也为此提供了工具。@alexchenco-我在回答中添加了一个承诺版本的代码。
var Promise = require("bluebird");
var fs = Promise.promisifyAll(require('fs'));

// your other code here

function parseHTML(files, callback) {
    var promises = [];

    files.forEach(function(file) {
        if (file.match(/\.html$/)) {
            promises.push(fs.readFileAsync(file, 'utf8'));
    });
    Promise.all(promises).then(function(results) {
        // all results in results array
        callback(null, results);
    }, function(err) {
       // error here
    });
}
var Promise = require("bluebird");
var fs = Promise.promisifyAll(require('fs'));

function parseHTML(files) {
    var promises = [];

    files.forEach(function(file) {
        if (file.match(/\.html$/)) {
            promises.push(fs.readFileAsync(file, 'utf8'));
    });
    return Promise.all(promises);
}

fs.readdirAsync(__dirname).then(parseHTML).then(function(results) {
    // files are in the results array here
}).catch(function(err) {
    // error here
});