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
});