一个fs.readFileSync的问题
发布于 12 年前 作者 hanai 28449 次浏览 最后一次编辑是 8 年前
var fs = require('fs');

fs.readFile('file.txt', 'utf-8', function(err, data) {
	if(err) {
    	console.error(err);
    } else {
	    console.log(data);
    }
});
console.log('end.');

var data2 = fs.readFileSync('file.txt', 'utf-8');
console.log(data2);
console.log('end.');

这段程序的执行结果为什么是

end.
Contents of the file.
end.
Contents of the file.

而不是下面这样的呢?

end.
Contents of the file.
Contents of the file.
end.
7 回复

因为交叉了

readFile 是异步的,会在当前代码段执行完毕之后才会执行读取文件的操作,所以data在最后一行才被打印出来;而readFileSync是同步读取文件内容

不明白。 单独

var data2 = fs.readFileSync('file.txt', 'utf-8');
console.log(data2);
console.log('end.');

我知道data2会在end.上面,可是为什么,前面添加了异步的readFile()变成这样

fs.readFile('file.txt', 'utf-8', function(err, data) { ... });
console.log('end.');

var data2 = fs.readFileSync('file.txt', 'utf-8');
console.log(data2);
console.log('end.');

后会对同步的readFileSync()产生影响,让data2跑到了end.下面。

交叉?

@Hanai 没有影响。是打印出来的语句一样,导致你看得时候有一些混淆。 你试着用下面的代码运行一下,应该就明白了。

var fs = require('fs');

fs.readFile('file.txt', 'utf-8', function(err, data) {
    if(err) {
        console.error(err);
    } else {
	    console.log("readFile");
    }
});
console.log('end. of readFile');

var data2 = fs.readFileSync('file.txt', 'utf-8');
console.log("readFileSync");
console.log('end. of readFileSync');

@CGWang 明白了,thank you。

.readFile的回调函数是异步的,所以在这里的console在下面的语句执行完后,才执行的

回到顶部