【问题标题】:How to syncronize recursive and asyncronize functions in nodejsnode js中如何同步递归和异步函数
【发布时间】:2020-01-21 20:09:46
【问题描述】:

我有一个函数可以读取目录(文件夹和文件)并在一个名为 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 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;
} 

我的问题是每当 generateFileItemInPathgenerateFolderItemInPathcreateItemsData 被调用时,代码永远不会在 createItemsData 中等待这些函数的结果

存在其他一些解决方案,但它们对我没有帮助。感谢您的贡献。

【问题讨论】:

标签: javascript node.js promise async-await synchronization


【解决方案1】:

async / await 仅适用于承诺。所以你的两个异步函数需要返回承诺,或者至少是 thenables(即带有.then() 方法的东西)。目前,它们没有返回任何内容(因此隐式返回 undefined)。

看起来您正在使用 Mongoose,对吧?如果您不指定回调,最新版本的 Mongoose 将从查询中返回 thenables,因此您可以只使用 return itemObj.save()

【讨论】:

    猜你喜欢
    • 2015-08-04
    • 2020-04-28
    • 1970-01-01
    • 1970-01-01
    • 2018-05-15
    • 2023-03-23
    • 2017-12-09
    • 2020-06-01
    • 2018-06-05
    相关资源
    最近更新 更多