Как синхронизировать рекурсивные и асинхронизированные функции в nodejs - PullRequest
0 голосов
/ 21 января 2020

У меня есть функция, которая читает dir (папки и файлы) и создает документы MongoDB в одной коллекции с именем Item. Все файлы, находящиеся во вложенных папках, также будут вставлены в документ 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;
} 

Моя проблема всегда, когда generateFileItemInPath , generateFolderItemInPath и createItemsData вызваны , код никогда не ждет результата этих функций в createItemsData .

Некоторые другие решения существуют, но они не помогли мне. Спасибо за ваш вклад.

1 Ответ

0 голосов
/ 21 января 2020

async / await работает только с обещаниями. Таким образом, две функции asyn c должны возвращать обещания или, по крайней мере, доступные для последующего использования (т.е. что-то с методом .then()) В настоящее время они ничего не возвращают (и поэтому неявно возвращают undefined).

Похоже, вы используете Mon goose, верно? Последние версии Mon goose будут возвращать возможности запросов из запросов, если вы не укажете обратный вызов, поэтому вы можете просто, например, return itemObj.save().

...