异步处理
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()

浙公网安备 33010602011771号