Node.js fs模块, 异步请求回调函数

fs模块中的方法都是异步请求,在for循环中使用fs函数时,for循环比较快,for循环结束后可能才会去异步请求,回调函数中的循环变量i是循环结束后的i的值。

demo.js:

var fs=require('fs');  //引入fs模块

//找出html目录下面的所有的目录,然后打印出来

//1. 错误写法  回调函数是异步。for循环比较快,for循环结束后才会去异步请求。
fs.readdir('html',function(error,files){
    if(error){
        console.log(error);
    }else{  /*判断是目录还是文件夹*/
        console.log(files);  /*可以正常打印出数组*/
        for(var i=0;i<files.length;i++){
            console.log(files[i]);  //可以正常打印出files[]
            fs.stat("html/"+files[i],function(error,stats){  /* for循环判断是目录还是文件  ---异步 错误写法*/
                if(stats.isDirectory()){
                    console.log(files[i]);  //files[i]  undefined (i超出下标) for循环比较快,for循环结束后才会去异步请求。此时i已经超出下标。
                }
            })
        }
    }
})


//打印出什么   3 3 3
//for(var i=0;i<3;i++){
//    setTimeout(function(){  //异步,会出错。
//        console.log(i);   //打印出 3 3 3
//    },100)
//}


//2. 正确的写法
var filesArr=[];  //存放目录的数组
fs.readdir('html',function(error,files){
    if(error){
        console.log(error);
    }else{  /*判断是目录还是文件夹*/
        //console.log(files);  /*可以正常打印出数组*/
        //正确写法,用可执行函数的递归 代替for循环
        (function getFile(i){
            if(i==files.length){  /*循环(递归)结束*/
                console.log('目录:');
                console.log(filesArr);   /*打印出所有的目录*/
                return false;
            }
            //files[i] = css js news.html
            //注意:目录
            fs.stat('html/'+files[i],function(error,stats){
                if(stats.isDirectory()){ /*目录*/
                    filesArr.push (files[i]);  /*保存数据*/
                }
                //递归掉用
                getFile(i+1);  //在异步回调函数里进行递归调用。依次异步请求,i依次加1,i就不会出错。
            })
        })(0)  //(0)表示传递给getFile()函数的参数
    }
})


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值