Как разрешить массив в классе, когда функции зависят друг от друга - PullRequest
0 голосов
/ 17 мая 2019

у меня есть две функции.

первая зацикливает некоторые папки, чтобы получить путь, путь разрешается в массиве.

вторая функция получает это значение и должна зацикливаться на этоммассив с fs.readdir для проверки количества изображений в этих папках.

Функция должна разрешать объект, содержащий путь и значение количества изображений в папках.

Моя проблемав том, что я просто правильно разрешаю первую папку и вместо общей суммы всех остальных.

Также я создал функцию обратного вызова, которая вызывает функцию, которая разрешает обещание следующим образом:

async pResolve(pr) {
    return new Promise((res, rej) => {
        res(pr);
    });
}

Я добавил эту функцию в цикл forEach следующим образом:

let x = pResolve(obj);
res(x);

Я попытался разрешить ее в:

Promise.all([folderList]).then(arrList => {
console.log(array); 
    });
}

Код во второй функции выглядит следующим образом:

async loopOverArray(){
const getPaths = await this.checkGalleryFolder();

let folderList = new Promise((res, rej) => {

getDir.forEach(val => {
let obj = {};
   fs.readdir(val, (err, data) => {
      obj.path = val;
      obj.img = data.length;
      res(obj);
 });
});
});

}

async checkGalleryFolder() {
const pathArr = [];
return new Promise((res, rej) => {
  fs.readdir(this.p, (err, folders) => {
    folders.forEach((val, i) => {
    if (val.includes("set")) {
    let gPath = this.p + `/${val}`;
    pathArr.push(gPath);
        res(pathArr);

// The function resolves this:
// [ '/sandbox/src/public/set1',
//  '/sandbox/src/public/set2',
//  '/sandbox/src/public/set3' ];

                }
            });
        });
    });
 }
 };

Как я уже говорил, я получаю объект, и он выглядит так:

[{ path: '/sandbox/src/public/set1', img: 12 }];

Однако результат должен выглядеть следующим образом:

[ { path: '/sandbox/src/public/set1', img: 12 },
 { path: '/sandbox/src/public/set2_f', img: 0 },
 { path: '/sandbox/src/public/set2', img: 12 },
 { path: '/sandbox/src/public/set3', img: 0 },
 { path: '/sandbox/src/public/set1_f', img: 0 } ];

Как я могу решить этоОбещать правильно?И почему функция checkGalleryFolder () дает мне правильный массив, а другая нет?

1 Ответ

0 голосов
/ 17 мая 2019

хорошо, я изменил loopOverArray () следующим образом, и теперь он разрешает массив со всеми объектами!Если кто-то знает лучший способ, пожалуйста, поделитесь им:)

async loopOverArray() {
    const getDir = await this.checkGalleryFolder();
    let arr = [];

    let folderList = new Promise((res, rej) => {
        getDir.forEach(val => {
            let obj = {};
            fs.readdir(val, (err, data) => {
                obj.path = val;
                obj.img = data.length;
                let x = Promise.resolve(obj);
                x.then(data => {
                    arr.push(data);
                    if (arr.length === getDir.length) {
                        res(arr);
                    }
                });
            });
        });
    });
...