函数相互依赖时如何解析类中的数组

时间:2019-05-17 18:35:16

标签: arrays node.js async-await es6-promise

我有两个功能。

第一个是循环访问某些文件夹以获取路径,该路径在数组中解析。

第二个函数获取此值,并应使用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 :(得分:0)

好的,我像这样改变了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);
                    }
                });
            });
        });
    });