同步异步的问题

var data='Hello,Node.js';
fs.writeFile('output.txt',data,function(err){
	if (err) {
		console.log(err);
	}else {
		console.log('ok.');
	}
});
fs.stat('output.txt',function(err,stats){
	if (err) {
		console.log(err);
	}else {
		console.log('isFile:'+stats.isFile());
		console.log('isDirectory:'+stats.isDirectory());
		if (stats.isFile()) {
			console.log('size:'+stats.size);
			console.log('birth time:'+stats.birthtime);
			console.log('modified time:'+stats.mtime);
		}
	}
});
输出内容为
isFile:true
isDirectory:false
size:0
birth time:Fri Jun 02 2017 14:47:28 GMT+0800 (CST)
modified time:Fri Jun 02 2017 15:16:04 GMT+0800 (CST)
ok.

问1:前面做了写入操作,下面显示的最后更改时间也是运行代码的时间,为什么size是0?
问2:为什么第一个函数的回调函数会是后执行的?
徐锦杰
浏览 1343回答 1
1回答

ruibin

fs.writeFile = function(path, data, options, callback) {  var callback = maybeCallback(arguments[arguments.length - 1]);  if (util.isFunction(options) || !options) {    options = { encoding: 'utf8', mode: 438 /*=0666*/, flag: 'w' };  } else if (util.isString(options)) {    options = { encoding: options, mode: 438, flag: 'w' };  } else if (!util.isObject(options)) {    throw new TypeError('Bad arguments');  }  assertEncoding(options.encoding);  var flag = options.flag || 'w';  fs.open(path, options.flag || 'w', options.mode, function(openErr, fd) {    if (openErr) {      if (callback) callback(openErr);    } else {      var buffer = util.isBuffer(data) ? data : new Buffer('' + data,          options.encoding || 'utf8');      var position = /a/.test(flag) ? null : 0;      writeAll(fd, buffer, 0, buffer.length, position, callback);    }  });};这是writeFile的源码,意思就是writeFile默认以'w'的方式打开,也就是打开文件的时候要先把文件内容置空。如果你想要追加打开,手动修改下配置。如:fs.writeFile('output.txt',data,{flag: 'w+'},function(err){});  
打开App,查看更多内容
随时随地看视频慕课网APP