Node.js笔记 --了不起的Node.js

来源:互联网 发布:自制二维码软件 编辑:程序博客网 时间:2024/05/01 09:58

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');elseconsole.log(' '+i+' \033[90m' + filename + '\033[39m');i++;if(i == files.length){console.log('');}elsefile(i);});/*for (var j = 0; j < 1000000000; j++) {};console.log(' loading');*/ }file(0);


file(0)执行到fs.stat时,注册事件但不执行,到了函数末尾再执行(注释部分会先执行,等待几秒然后打印loading,然后再打印stat,接着递归file(1))


0 0