fs.readFile同步异步没区别?
 发布于 13 年前  作者 coolicer  16917 次预览  最后一次回复是 13 年前  来自  

Node.js开发指南上

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

运行的结果如下: end. Contents of the file. 而如果是同步的话fs.readFileSync,就会是 Contents of the file. end. -----------------------------分隔线--------------------------------- 我得到的结果却是: Contents of the file. end. -----------------------------分隔线--------------------------------- 是版本更新了才变成这样,还是?求解?

18 回复
venngomez

来个大点的file ?

gxmari007

异步是两种都可能出现…就看执行快慢了

a272121742

所谓的异步并不阻塞,程序依然执行,异步的操作会在适合的时机完成,有可能在某个同步操作之前,或者之后

coolicer

我看到头像以为穿越了,我也有用这个头像。

一般是用异步多还是同步多?

coolicer

有个问题,这个readFile有可能返回2种类型的数据,一种是UTF8和buffer 。我查了一下这个file类型,查不到资料。我想问, 这个readFile可以读什么类型的文件?

coolicer

原来是这样啊。

zxc122333

不清楚你有什么疑问。。。 异步的,就应该是这样 end. Contents of the file.

同步的,就应该是这样 Contents of the file. end.

有什么问题吗? 无论这个文件的大小,哪怕文件是零,顺序都是固定的

coolicer

我又试了一次。好像不会了,可能是我昨天弄错了。谢谢

charje

异步的时候,下面的语句会被执行,不等待读取完成在执行。如果不对请指出。

venngomez

既然是异步,也就是没顺序,什么都有可能。

zxc122333

@venngomez 明显是错的,思考:setTimeout(func,0),这个会在什么时候执行?

venngomez

@coolicer 昨天也可能没错,今天也可能错了。档案的大小、cpu的load等都有可能产生不同的顺序,这些都靠不住,我也遇到过,在开发机上就是有一定的顺序,上载到生产server上又是另一顺序,可能cpu强了些?

venngomez

@coolicer readFile可读任何类型的文件,如加UTF8, 结果就是String, 如没就是buffer, 这时可来个toString如果是text的话,utf8的优点是你不要来这下,如果你清楚你的文件是text.

zxc122333

@venngomez 建议你看一下底层的libuv,最好是用libuv写一个小练手,这样你就知道应该是什么顺序了

venngomez

@zxc122333 是的,我那个说法不对,谢谢指正。

gxmari007

@coolicer 一般来说后面那步依赖前面那步的话就得用同步,反之用异步更快些,把异步和同步想像成同时起步赛跑和接力赛应该更好理解吧。

leizongmin

@coolicer

fs.readFile(filename, function (err, content) {
  // content是Buffer类型
});

leizongmin
fs.readFile(filename, 'utf8', function (err, content) {
  // content是String类型
});