异步处理

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

  

原文地址:https://www.cnblogs.com/shanlu0000/p/13149632.html