异步处理
assets文件夹下面有images css js目录 以及index.html , 找出 wwwroot目录下面的所有的目录,然后放在一个数组中
const fs = require('fs') var path = './assets' var dirArr=[] fs.readdir(path,(err,data)=>{ if(err){ console.log(err) return } //console.log(data) //[ 'css', 'images', 'index.html', 'js' ] for(let i=0;i<data.length;i++){ fs.stat(path+'/'+data[i],(err,res)=>{ if(res.isDirectory()){ dirArr.push(data[i]) } }) } }) console.log(dirArr) //[]
dirArr 始终是空数组,因为 fs中的方法是异步的,for 循环一个异步,当for 循环执行结束了,i=data.length 的时候,开始 fs.stat 的判断时,data[i] 并不存在,没有这个文件或者目录,不会往 dirArr 中添加任何元素,所以是空数组
解决方法1:将 for 循环改成递归调用
const fs = require('fs') var path = './assets' var dirArr = [] fs.readdir(path, (err, data) => { if (err) { console.log(err) return } //console.log(data) //[ 'css', 'images', 'index.html', 'js' ] (function getDir(i){ if(i==data.length){ console.log(dirArr) //['css', 'images', 'js'] return } fs.stat(path + '/' + data[i], (err, res) => { if (res.isDirectory()) { dirArr.push(data[i]) } getDir(i+1) }) })(0) })
解决方法2:async , await
const fs = require('fs') //定义一个 isDir 的方法判断一个资源是目录还是文件 //这个方法需要在外部被调用,所以需要定义成异步的 async function isDir(path){ return new Promise((resolve,reject)=>{ fs.stat(path,(err,data)=>{ if(err){ reject(err) return } if(data.isDirectory()){ //是目录 resolve(true) } else{ resolve(false) } }) }) } //获取assets里面的所有资源 循环遍历 function getDir(){ const path = './assets' const dirArr = [] fs.readdir(path,async(err,data)=>{ //await是用在这个回调中的,所以需要定义成 async if(err){ console.log(err) return } for(let i=0;i<data.length;i++){ //console.log(isDir(path + '/' + data[i])) //Promise { <pending> },4个 //console.log(await isDir(path+'/'+data[i])) //true true false true if(await isDir(path+'/'+data[i])){ dirArr.push(data[i]) } } console.log(dirArr) //[ 'css', 'images', 'js' ] }) } getDir()