当先锋百科网

首页 1 2 3 4 5 6 7

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))