当fs.readFile包含回调作为参数时,为什么它需要包装



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

我的理解是,当异步函数完成并返回一些值(这里是文件的内容)时,回调将在返回的数据上运行。

  1. 如果fs.readFile(file,callback)希望传递回调函数,那么为什么它似乎在fs.readFile()完成之前运行回调?

  2. 为什么将数据分配给另一个变量会改变它的行为方式?

谢谢。

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")

最新更新