Javascript-форум (https://javascript.ru/forum/)
-   Node.JS (https://javascript.ru/forum/node-js-io-js/)
-   -   Массив значений из async рекурсивной функции (https://javascript.ru/forum/node-js-io-js/75009-massiv-znachenijj-iz-async-rekursivnojj-funkcii.html)

Tipylja 25.08.2018 17:46

Массив значений из async рекурсивной функции
 
Здравствуйте. Есть функция, рекурсивная, которая бегает по файловой системе
const scanDir = async (dir, filelist = []) =>{
    const files = await readdir(dir);
    files.forEach(async (file)=>{
        const dirFile = path.join(dir, file);
        try {
            filelist = await scanDir(dirFile, filelist);
        }
        catch (err) {
            if (err.code === 'ENOTDIR' || err.code === 'EBUSY')
            {                
                filelist = await [...filelist, dirFile];
                
            }
            else throw err;
        }
    });

    return filelist;
};

Подключенные модули и функции
const fs = require('fs')
    ,{promisify} = require('util')
    ,path = require('path')
    ,jimp = require('jimp')
    ,readdir = promisify(fs.readdir)
    ,exists = promisify(fs.exists)
    ,mkdir = promisify(fs.mkdir)
    ,copyFile = promisify(fs.copyFile);


Я наверное что-то не понимаю, опыта мало, но как я вижу, она возвращает массив filelist, который передается в рекурсию дальше.
Но как принять этот массив после окончания работы функции?
То есть вот так не работает:
const myArr = scanDir(dir);

Пробовал это оборачивать в async функцию и ждать пока scanDir разрезолвится, как-то так:
(async()=>{
const myArr = await scanDir(dir);
})()

Но это тоже не работает. Так же еще пробую так:
scanDir(dir).catch(
    (err)=>{
        console.log(err);
    }
).then(

    (data)=>{console.log(data.length)}

);

В data возвращается массив, но он пустой. Подскажите пожалуйста, как правильно получить наполненный массив из функции scanDir?

destus 25.08.2018 20:21

Tipylja,
forEach на обычный цикл for...of замените, и будет вам счастье.

Tipylja 26.08.2018 12:07

Цитата:

Сообщение от destus (Сообщение 493396)
Tipylja,
forEach на обычный цикл for...of замените, и будет вам счастье.

Все работает! Спасибо=)))


Часовой пояс GMT +3, время: 21:37.