我是Node.js的新手,与fs.readFile()
的交互令人困惑。
最初,我认为我可以使用读取文件
fs.readFile("file.txt",function(err,data) {
if(err) {throw err;}
console.log(data);
});
然而,这打印为空。我查阅了文档,它给出了完全相同的例子,并声称它运行良好!
然后我查阅了堆栈溢出,在这篇文章和这篇文章中发现,一个解决方案是将fs.readFile()
封装在您自己的函数中,该函数接受回调:
function read(file,callback) {
fs.readFile("file.txt",function(err,data) {
if(err) {throw err;}
callback(data);
});
}
read(file, function(data) {
console.log(data);
});
或者,也可以将数据分配给一个新变量:
var content;
fs.readFile("file.txt",function(err,data) {
if(err) {throw err;}
content = data;
console.log(content);
});
我的理解是,当异步函数完成并返回一些值(这里是文件的内容)时,回调将在返回的数据上运行。
如果
fs.readFile(file,callback)
希望传递回调函数,那么为什么它似乎在fs.readFile()
完成之前运行回调?为什么将数据分配给另一个变量会改变它的行为方式?
谢谢。
fs.readFile("file.txt",function(err,data) {
if(err) {throw err;}
console.log(data);
});
确实有效。不起作用的是:
var content;
fs.readFile("file.txt",function(err,data) {
if(err) {throw err;}
content = data;
});
console.log(content);
(这是你提到的帖子中的例子)
原因是fs.readLine与您的代码异步,这意味着执行将立即进行,而无需等待fs.readLine的响应。
因此,在后一个例子的情况下,
console.log(content);
将在fs.readLine返回答案之前执行(即触发回调)。
通常,你不能运行异步方法并期望它们立即得到答案,异步的整个想法是它不会阻塞,在异步方法返回答案之前执行/程序会继续。
异步方法中回调的全部目的是为方法提供一种方法,以便在回调完成时通知您并向您提供结果。
包装fs.readLine并不能解决这个问题,它只是为读取文件提供了一个更干净的接口(而不是调用"fs.readLine",你只需要调用"read")