Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 当fs.readFile包含回调作为参数时,为什么它需要一个包装器?_Javascript_Node.js_Asynchronous_Callback - Fatal编程技术网

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

Javascript 当fs.readFile包含回调作为参数时,为什么它需要一个包装器?,javascript,node.js,asynchronous,callback,Javascript,Node.js,Asynchronous,Callback,我是Node.js的新手,与fs.readFile的交互令人困惑 起初,我认为我可以使用 fs.readFile("file.txt",function(err,data) { if(err) {throw err;} console.log(data); }); 但是,此打印为空。我咨询了,它给出了完全相同的例子,并声称它工作得很好 然后,我查阅了stack overflow,并在中发现了一个解决方案,即在您自己的函数中封装fs.readFile,该函数接受回调: funct

我是Node.js的新手,与fs.readFile的交互令人困惑

起初,我认为我可以使用

fs.readFile("file.txt",function(err,data) {
    if(err) {throw err;}
    console.log(data);
});
但是,此打印为空。我咨询了,它给出了完全相同的例子,并声称它工作得很好

然后,我查阅了stack overflow,并在中发现了一个解决方案,即在您自己的函数中封装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.readFilefile,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即可。您的初始代码运行良好。假设您有var fs=requirefs;在它之前,在当前目录中有一个名为file.txt的文件,它可以工作。我只是再试一次,效果很好。我想知道是什么原因导致了我以前的错误。我想cleaner接口的目的是帮助避免我最初遇到的任何问题:。很好的解释。