我的应用程序需要读取一个包含多个文件的文件夹。所有文件应异步获取。所有文件的输出应合并为一个数组。为了做到这一点,下面的代码已经完成。(我用了诺言)。对于单个文件,它起作用,但是对于多个文件,它不起作用。需要您的建议。
来自files.js的代码
function readFolder(FolderPath){
return new Promise(function(resolve, reject){
fs.readdir(FolderPath, (err, files) => {
if (err) {
logger.error(`Folder (${FolderPath}) reading Failed :` + err)
reject(error = "Reading Folder failed")
} else {
console.log('resolved')
resolve(files)
}
})
})
};
function readFile(FilePath){
return new Promise(function(resolve,reject){
fs.readFile(FilePath, (err, data) => {
if (err) {
reject(error = "Reading file failed")
} else {
console.log('Read File started :'+FilePath)
var chunk = data.toString();
var lines = chunk.split('\n');
var routes = []
for(var line = 0; line < lines.length; line++){
if (lines[line].match(/router.post/)){
currentRoute = lines[line].substring(lines[line].indexOf("'")+1 , lines[line].lastIndexOf("'"))
route = "/api/angular" + currentRoute
routes.push(route)
}
}
if (routes !== []){
console.log('routes for file is :' + routes)
}
resolve(routes)
}
})
})
};
function readFiles(FilePaths){
return new Promise(function(resolve, reject){
let routesArray = []
FilePaths.forEach(FilePath => {
console.log("File Path :"+FilePath)
readFile(FilePath)
.then((routes) => {
console.log('Concatinate')
routesArray = routesArray.concat(routes)
})
.catch((error) => {
console.log(error)
})
})
console.log(routesArray)
resolve(routesArray)
})
}
文件名:api.js(承诺调用)
const files = require('./../controlers/files')
files.readFolder(FolderPath)
.then((filesArray) => {
var FilePaths = [];
filesArray.forEach(file => {
path = "routes/"+file
FilePaths.push(path)
})
console.log(FilePaths)
return files.readFiles(FilePaths)
})
.then((routes) => {
console.log('routes :', routes)
res.status(200).send(routes)
})
.catch((error) => {
response.message = "Folder or file Reading failed";
response.success = false;
res.status(500).send(response);
})
请提出我错了的地方。
当.forEach
与Promise语法一起使用时(readFiles
功能上),您“错了” 。.forEach
是“回调”样式的函数,在Promise中无法正常使用。
您需要等待所有文件都完成,我的建议是使用Array.map
和Promise.all
:
function readFiles(FilePaths) {
return new Promise(function (resolve, reject) {
let routesArray = []
const promises = FilePaths.map(FilePath => { // get back an array of promises
console.log("File Path :" + FilePath)
return readFile(FilePath)
.then((routes) => {
console.log('Concatinate')
routesArray.push(...routes) // I like .push function
})
.catch((error) => {
console.log(error)
})
});
Promise.all(promises)
.then(() => { // all done!
console.log(routesArray)
resolve(routesArray)
})
})
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句