1.对于单线程,事件驱动的理解
书上51页的file-explorer程序,是用函数以及递归的方式将每个文件列出来,我想改成循环实现:
for (var i = 0; i < files.length; i++)
{
var filename = files[i];
fs.stat(__dirname + '/' + filename, function(err, stat){
if(stat.isDirectory())
{
console.log(' '+i+' \033[36m' + filename + '/\033[39m');
}
else
{
console.log(' '+i+' \033[90m' + filename + '\033[39m');
}
});
};
结果:列出的3个文件都是最后一个文件。
原因:事件驱动,fs.stat会等待事件,for循环3次都完成后,i变为3,filename为files[2],然后顺序执行了3次fs.stat,因此输出"3 package.json"3次。
书上的正确代码:
function file(i)
{
var filename = files[i];
fs.stat(__dirname + '/' + filename, function(err, stat)
{
if(stat.isDirectory())
console.log(' '+i+' \033[36m' + filename + '/\033[39m');
else
console.log(' '+i+' \033[90m' + filename + '\033[39m');
i++;
if(i == files.length)
{
console.log('');
}
else
file(i);
});
/*for (var j = 0; j < 1000000000; j++) {
};
console.log(' loading');*/
}
file(0);
file(0)执行到fs.stat时,注册事件但不执行,到了函数末尾再执行(注释部分会先执行,等待几秒然后打印loading,然后再打印stat,接着递归file(1))