我是Node.js的新手,我与fs.readFile()
进行了一次令人困惑的互动。
最初,我以为我可以使用
读取文件fs.readFile("file.txt",function(err,data) {
if(err) {throw err;}
console.log(data);
});
但是,这打印为null。我咨询了documentation,它给出了完全相同的例子并声称它工作正常!
然后我咨询了堆栈溢出,并在this post和this post中找到了一个解决方案是将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()
完成之前似乎运行了回调?
为什么将数据分配给另一个变量会改变其行为方式?
感谢。
答案 0 :(得分:1)
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"你只需要调用"阅读&# 34)