javascript - 如何将递归回调函数转换为异步等待格式
问题描述
我想将递归回调函数转换为 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');
解决方案
非常容易理解,
这就是我调用函数的方式,
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);
}
});
});
};
这个解决方案对我来说非常好。
推荐阅读
- javascript - 在 Clion 中集成 Emscripten
- arrays - 多维 np.argmax?
- json - 带有套接字的 ReactJS 嵌套 JSON 解析数据问题
- angular - 当路由在 Angular 组件中没有解析器时的处理
- c++ - 如何在 C++ 中引用类结构中的函数?
- docker-compose - drone.io apache 指令是否已过时?
- django - NoReverseMatch 尝试在不同的 urlpatterns 列表中生成带有 slug/pk 正则表达式组合的 URL
- javascript - 将 RxJS 5 Rx.Observable.timer(3000).mapTo({ id: 1 }) 转换为 RxJS 6?
- c# - 将 Unity 中的 2D 相机移动限制在我的地图边缘
- javascript - 对复选框和无线电组件做出反应