NodeJS等待异步功能完成foreach

Premt

您好,我一直在尝试使用异步模块进行此尝试,并不真正知道如何将其转换为一个尝试过的方法,承诺它并不能很好地工作,我认为我做错了,所以我将功能恢复为原来的方式。第一的

基本上我想等到ReadJson()函数完成后,再读取数组中的所有json文件,然后再执行其他功能,例如editjson等

代码:

App.js

const Reader = require('./Reader');
Reader.ReadJson();

Reader.js

const fsp = require('fs-promise');
const JsonFiles = ['json1.json', 'json2.json', 'json3.json', 'json4.json'];
const JsonContents = [];
class Reader {
    static ReadJson() {
        JsonFiles.forEach(name => {
            let FileDir = "D:\\Development\\Java\\" + name;
            fsp.readJson(FileDir).then(contents => {
                if (contents) {
                    JsonContents.push(contents);
                    console.log(`Loaded >> ${name} ${Reader.JsonContents.length}/${JsonFiles.length}`);
                }
            });
        });
        console.log('Done Reading Json Content!');
        //Other functions
    }
}
Reader.JsonContents = JsonContents;
module.exports = Reader;

所以基本上输出是:

Done Reading Json Content!
Loaded >> json1.json 1/4
Loaded >> json2.json 2/4
Loaded >> json3.json 3/4
Loaded >> json4.json 4/4

当我需要它时:

Loaded >> json1.json 1/4
Loaded >> json2.json 2/4
Loaded >> json3.json 3/4
Loaded >> json4.json 4/4
Done Reading Json Content!

谢谢 :)

罗恩·达登(Ron Dadon)

兑现承诺,跟踪您的进度forEach并仅在JsonContents长度与JsonFiles长度相同时解决

const fsp = require('fs-promise');
const JsonFiles = ['json1.json', 'json2.json', 'json3.json', 'json4.json'];
const JsonContents = [];
class Reader {
    static ReadJson() {
        return new Promise((resolve, reject) => {
            JsonFiles.forEach(name => {
                let FileDir = "D:\\Development\\Java\\" + name;
                fsp.readJson(FileDir).then(contents => {
                    if (contents) {
                        JsonContents.push(contents);
                        console.log(`Loaded >> ${name} ${Reader.JsonContents.length}/${JsonFiles.length}`);
                    }
                    if (JsonContents.length == JsonFile.length) {
                        return resolve(JsonContents);
                    }
                }).catch(err => {
                    return reject(err);
                });
            });
        });
    }
}
Reader.JsonContents = JsonContents;
module.exports = Reader;

然后在您的应用程序中使用它:

const Reader = require('./Reader');
Reader.ReadJson().then(() => { console.log('Done Reading Json Content!'); });

另一个选择是using Promise.all,因为您正在使用fs-promise,但是尽管可以使用,但forEach常规for循环在此处更好。

const fsp = require('fs-promise');
const JsonFiles = ['json1.json', 'json2.json', 'json3.json', 'json4.json'];
const JsonContents = [];
class Reader {
    static ReadJson() {
        var promises = [];
        for (let i = 0; i < JsonFiles.length; i++) {
            let FileDir = "D:\\Development\\Java\\" + JsonFiles[i];
            promises.push(fsp.readJson(FileDir).then(contents => {
                if (contents) {
                    JsonContents.push(contents);
                    console.log(`Loaded >> ${JsonFiles[i]} ${Reader.JsonContents.length}/${JsonFiles.length}`);
                }
            }));

        }
        return Promise.all(promises);
    }
}
Reader.JsonContents = JsonContents;
module.exports = Reader;

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章