Javascript 如何将递归回调函数转换为异步等待格式
我想将递归回调函数转换为异步等待格式,下面是代码Javascript 如何将递归回调函数转换为异步等待格式,javascript,node.js,async-await,Javascript,Node.js,Async Await,我想将递归回调函数转换为异步等待格式,下面是代码 function findFiles(currentDirPath, callback) { fs.readdir(currentDirPath, function (err, files) { if (err) { throw new Error(err); } files.forEach(function (name) { var file
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);
});
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);
}
});
});
};
下面是我取得的进步,我不知道这条路对不对,请引导我
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');
首先,如果您已经准备好使用实验API,您需要承诺使用函数
const { promisify } = require('util')
const fs = require('fs')
const readdir = promisify(fs.readdir)
const stat = promisify(fs.stat) // to use instead of statSync
然后你可以做这样的事情
async function forEachFile(dir, fn) {
const files = await readdir(dir)
for( const item of files) {
const filePath = path.join(dir, item)
const stats = await stat(filePath);
if (stats.isFile()) {
await fn(filePath, stats) // in case fn is async
} else if(stats.isDirectory()) {
await forEachFile(filePath, fn)
}
}
}
很容易理解, 这就是我调用函数的方式
findFiles('./logs', function(route){
console.log(route);
});
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);
}
});
});
};
这个解决方案对我来说非常有效。问题是……对不起,@YuryTarabanko我已经纠正了这个问题。你试过什么了吗?还请记住,async/await仅适用于承诺。您尝试了什么,出现了什么问题?显然,你需要使用承诺。用于..而不是forEach,它已过时。@estus“forEach,它已过时”从何时开始?Node 10用户不需要Promission步骤,这里有fs.Promissions。@YuryTarabanko您对这个解决方案有什么看法?