Javascript 如何在nodejs中同步递归和异步函数
我有一个函数,可以读取dir(文件夹和文件)并在一个名为Item的集合中创建MongoDB文档。嵌套文件夹中的每个文件也将插入MongoDB文档中 我的文件功能类似于:Javascript 如何在nodejs中同步递归和异步函数,javascript,node.js,promise,async-await,synchronization,Javascript,Node.js,Promise,Async Await,Synchronization,我有一个函数,可以读取dir(文件夹和文件)并在一个名为Item的集合中创建MongoDB文档。嵌套文件夹中的每个文件也将插入MongoDB文档中 我的文件功能类似于: async generateFileItemInPath(path, itemName){ let itemObj = new Item(); //let itemObj = {}; itemObj.itemName = itemName; itemObj.isAFile = true;
async generateFileItemInPath(path, itemName){
let itemObj = new Item();
//let itemObj = {};
itemObj.itemName = itemName;
itemObj.isAFile = true;
itemObj.itemPath = path;
itemObj.save(function (err) {
if (err){
console.log("Error");
} else {
console.log("No Error !");
return itemObj;
}
});
}
async generateFolderItemInPath(path, itemName){
let itemObj = new Item();
//let itemObj = {};
itemObj.itemName = itemName;
itemObj.isAFile = false;
itemObj.itemPath = path;
itemObj.save(function (err) {
if (err){
console.log("Error");
} else {
console.log("No Error !");
return itemObj;
}
});
}
“我的文件夹”功能类似于:
async generateFileItemInPath(path, itemName){
let itemObj = new Item();
//let itemObj = {};
itemObj.itemName = itemName;
itemObj.isAFile = true;
itemObj.itemPath = path;
itemObj.save(function (err) {
if (err){
console.log("Error");
} else {
console.log("No Error !");
return itemObj;
}
});
}
async generateFolderItemInPath(path, itemName){
let itemObj = new Item();
//let itemObj = {};
itemObj.itemName = itemName;
itemObj.isAFile = false;
itemObj.itemPath = path;
itemObj.save(function (err) {
if (err){
console.log("Error");
} else {
console.log("No Error !");
return itemObj;
}
});
}
我从这个递归函数调用这些函数:
async createItemsData(parentPath, itemName) {
let resultList = [];
let itemsPath = parentPath+itemName;
let itemsInPath = fs.readdirSync(itemsPath);
for(let i=0; i<itemsInPath.length; i++){
let isDirAFile = fs.lstatSync(itemsPath + itemsInPath[i]).isFile();
let isDirAFolder = fs.lstatSync(itemsPath + itemsInPath[i]).isDirectory();
if(isDirAFile){
let tempItemObj = await self.generateFileItemInPath(itemsPath, itemsInPath[i]);
resultList.push(tempItemObj);
} else if(isDirAFolder){
let tempItemObj = await self.generateFolderItemInPath(itemsPath, itemsInPath[i]);
tempItemObj.itemChildren = [];
tempItemObj.itemChildren.push(await self.createItemsData(itemsPath, itemsInPath[i] + "\\"));
resultList.push(tempItemObj);
}
}
return resultList;
}
异步createItemsData(父路径、项名称){
让resultList=[];
让itemsPath=parentPath+itemName;
让itemsInPath=fs.readdirSync(itemsPath);
for(让i=0;i
async/await
仅与承诺一起工作。因此,您的两个异步函数需要返回承诺,或者至少返回这些承诺(即带有.then()
方法的内容)。目前,它们不返回任何内容(因此隐式返回未定义的)
看起来您正在使用Mongoose,对吗?如果您不指定回调,最新版本的Mongoose将从查询中返回表,因此您可以只返回itemObj.save()
您将无法在传统循环中使用Wait。有关信息,请参阅此问题