Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/35.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何在nodejs中同步递归和异步函数_Javascript_Node.js_Promise_Async Await_Synchronization - Fatal编程技术网

Javascript 如何在nodejs中同步递归和异步函数

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;

我有一个函数,可以读取dir(文件夹和文件)并在一个名为Item的集合中创建MongoDB文档。嵌套文件夹中的每个文件也将插入MongoDB文档中

我的文件功能类似于:

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。有关信息,请参阅此问题