为什么fs.readFile在包含回调作为参数时需要包装器?

时间:2017-01-30 19:31:07

标签: javascript node.js asynchronous callback

我是Node.js的新手,我与fs.readFile()进行了一次令人困惑的互动。

最初,我以为我可以使用

读取文件
fs.readFile("file.txt",function(err,data) {
    if(err) {throw err;}
    console.log(data);
});

但是,这打印为null。我咨询了documentation,它给出了完全相同的例子并声称它工作正常!

然后我咨询了堆栈溢出,并在this postthis 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);
});

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

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

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

  3. 感谢。

1 个答案:

答案 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)