gpt4 book ai didi

javascript - 如何在循环中处理异步 Node.js

转载 作者:搜寻专家 更新时间:2023-10-31 23:01:25 25 4
gpt4 key购买 nike

我有这样一个循环:

var i,j,temparray,chunk = 200;
for (i=0,j=document.mainarray.length; i<j; i+=chunk) {
temparray = document.mainarray.slice(i,i+chunk);

var docs = collection.find({ id: { "$in": temparray}}).toArray();

docs.then(function(singleDoc)
{
if(singleDoc)
{
console.log("single doc length : " + singleDoc.length);
var t;
for(t = 0, len = singleDoc.length; t < len;t++)
{
fs.appendFile("C:/Users/x/Desktop/names.txt", singleDoc[t].name + "\n", function(err) {
if(err) {
return console.log(err);
}
});
}
}
});
}

循环迭代两次。在第一次迭代中,它获得了 200 个元素,在第二次迭代中,它获得了 130 个元素。当我打开 .txt 文件时,我只看到 130 个名字。我猜是因为 Node.js 的异步特性,只处理数组的第二部分。我应该怎么做才能处理数组的所有部分?提前致谢。

编辑:我终于把代码变成了这个:

var generalArr = [];
var i,j,temparray,chunk = 200;
for (i=0,j=document.mainarray.length; i<j; i+=chunk) {
temparray = document.mainarray.slice(i,i+chunk);

generalArr.push(temparray);


}

async.each(generalArr, function(item, callback)
{

var docs = collection.find({ id: { "$in": item}}).toArray();

docs.then(function(singleDoc)
{
if(singleDoc)
{
console.log("single doc length : " + singleDoc.length);
var t;
for(t = 0, len = singleDoc.length; t < len;t++)
{
fs.appendFile("C:/Users/x/Desktop/names.txt", singleDoc[t].name + "\n", function(err) {
if(err) {
return console.log(err);
}
});
}
}


});

callback(null);
})

当我改变这一行时:

var docs =  collection.find({ id: { "$in": item}}).toArray();

到这一行:

var docs =  collection.find({ id: { "$in": item}}).project({ name: 1 }).toArray();

有效,我可以打印所有名称。我想当我尝试不使用 .project() 时内存有问题。如何在不使用项目的情况下完成这项工作?我应该更改一些内存限制吗?提前致谢。

最佳答案

我认为您的代码不必要地复杂,并且与内存计算相比,在循环中附加文件非常昂贵。更好的方法是只写入一次文件。

var i, j, temparray, chunk = 200;
for (i = 0, j = document.mainarray.length; i < j; i += chunk) {
temparray = document.mainarray.slice(i, i + chunk);
generalArr.push(temparray);
}
const queryPromises = [];
generalArr.forEach((item, index) => {
queryPromises.push(collection.find({ id: { "$in": item } }).toArray());
});
let stringToWrite = '';
Promise.all(queryPromises).then((result) => {
result.forEach((item) => {
item.forEach((element) => {
//create a single string which you want to write
stringToWrite = stringToWrite + "\n" + element.name;
});
});
fs.appendFile("C:/Users/x/Desktop/names.txt", stringToWrite, function (err) {
if (err) {
return console.log(err);
} else {
// call your callback or return
}
});
});

在上面的代码中,我执行了以下操作。

  1. 等待所有数据库查询完成
  2. 让我们遍历这个列表并创建一个我们需要写入文件的字符串
  3. 写入文件

关于javascript - 如何在循环中处理异步 Node.js,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45241725/

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