gpt4 book ai didi

javascript - 一次处理 1 个包含异步函数的循环

转载 作者:行者123 更新时间:2023-12-03 01:51:00 25 4
gpt4 key购买 nike

我有一个程序,需要迭代数百个文件夹。每个文件夹都包含一个主 xml 文件,我读取该文件,然后循环遍历文件中的每个元素。我的过程是读取目录并获取文件夹,然后对文件夹执行 for 循环,然后将主文件中的每个元素放入数组中并执行 forEach。 forEach 内部有 2 个被调用的异步函数。两者都是 mongoDB 查询。首先是进行查找以获取每个元素的数据,然后最后对 mongoDB 进行更新。

我遇到的问题是,由于异步函数在执行之前排队并等待循环完成,因此进程内存不足。在本例中,可能有大约 100,000 个元素,因此处理起来太多了。

我想弄清楚是否有更好的方法来做到这一点,或者是否有一种方法可以在进入下一个文件夹之前完全处理单个文件夹。

这是代码结构的简化示例。

fs.readdir(dirname + 'folders', function(err, folders) {
for (var i = 0; i < folders.length; i++) {
var resources = resources;
resources.forEach(function(doc) {
//do lookup in mongodb
getStandardsArray(doc, function(standardsArray, origItem) {
//In callback update item in mongodb
db.collection(collection).update( {"id": id}, origItem, { upsert: true}, function(err, numberAffected) {
if (err) {
console.log(err);
}
});
});
});
}
}

getStandardsArray = function(item, standards, callback) {
sharedDb.collection("standards").findOne({"id": formatGUID(standards[i])}, function(err, doc) {
callback(standardsArray, item);
});

最佳答案

您可以使用递归函数编写自己的循环;这样你就可以等到所有回调/ promise 都解决后再继续下一个文件夹:

const folders = ["A", "B", "C", "D", "E"];
var folderIndex = -1;

function processNextFolder() {
if (++folderIndex === folders.length) return; // done
new Promise((resolve, reject) => {
setTimeout(() => {
console.log(`Folder ${folders[folderIndex]} processed`);
resolve();
}, 1000);
}).then(() => {
processNextFolder();
})
}

console.log("Starting...");
processNextFolder();

关于javascript - 一次处理 1 个包含异步函数的循环,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50412758/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com