• 异步处理


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

      

  • 相关阅读:
    JSON 语法
    AJAX 原理与使用
    SpringMVC MVC 架构模式
    HTTP 协议
    OSI 七层参考模型与 TCP/IP 四层协议
    MyBatis 延迟加载(十四)
    关于JVM调优
    mysql的锁
    spring boot启动原理
    redis相关问题解决
  • 原文地址:https://www.cnblogs.com/shanlu0000/p/13149632.html
Copyright © 2020-2023  润新知