首页 > 解决方案 > 如何将递归回调函数转换为异步等待格式

问题描述

我想将递归回调函数转换为 async-await 格式,下面是代码,

function findFiles(currentDirPath, callback) {
    fs.readdir(currentDirPath, function (err, files) {
        if (err) {
            throw new Error(err);
        }
        files.forEach(function (name) {
            var filePath = path.join(currentDirPath, name);
            var stat = fs.statSync(filePath);
            if (stat.isFile()) {
                callback(filePath, stat);
            } else if (stat.isDirectory()) { //if directory call function
                findFiles(filePath, callback);
            }
        });
    });
}

这就是我调用函数的方式,

findFiles('./logs', function(route){
    console.log(route);
});

以下是我取得的进展,我不知道它是否正确,请指导我。

var bundle = [];
var findFiles = async function (root) {

    let files = await readFile(root);
    for(let inx in files){
        var filePath = path.join(root, files[inx]);
        var stat = fs.statSync(filePath);

        if (stat.isFile()) {
            bundle.push(filePath);
        } else if (stat.isDirectory()) {
            await findFiles(filePath);
        }

    }
    return bundle;
};

let readFile = function(dir){
    return new Promise((resolve, reject) => {
        fs.readdir(dir, function(err,files){
            if (!err) {
                resolve(files); 
            } else {
                reject(err);
            }
        });
    });
};

这就是我调用文件的方式,

 let files = await findFiles('./logs');

标签: javascriptnode.jsasync-await

解决方案


非常容易理解,

这就是我调用函数的方式,

await (async ()=> {
   return new Promise(async function(resolve, reject) {
       await findFiles(configs.server.routes.root, function(route){
           console.log(route)
           //do things
        });
    });
})();

var findFiles = async function (root, callback) {

    let files = await readFile(root);
    for(let inx in files){
        var filePath = path.join(root, files[inx]);
        var stat = fs.statSync(filePath);

        if (stat.isFile()) {
            callback(filePath);
        } else if (stat.isDirectory()) {
            await findFiles(filePath, callback);
        }

    }
};

let readFile = function(dir){
    return new Promise((resolve, reject) => {
        fs.readdir(dir, function(err,files){
            if (!err) {
                resolve(files); 
            } else {
                reject(err);
            }
        });
    });
};

这个解决方案对我来说非常好。


推荐阅读