Javascript 节点JS forEach内存泄漏问题
我一直在创建一个小的NodeJS应用程序,它可以遍历一个名称数组,并在API中查询名称。我遇到的问题是,数组非常大,超过400000个字,我的应用程序在forEach完成之前内存不足 通过研究JS如何处理调用堆栈、web api和回调队列,我已经能够诊断出这个问题。我认为问题在于forEach循环阻塞了调用堆栈,因此http请求继续阻塞回调队列而没有得到解决 如果有人能提供一个解决方案来解除forEach循环的阻塞,或者提供一种替代的编码方式,我将非常感谢 节点JS应用程序 检查 检查api是否接受多个查询参数。 尝试使用异步承诺。 解析承诺并尝试通过Promiseall对承诺执行保存操作Javascript 节点JS forEach内存泄漏问题,javascript,node.js,foreach,memory-leaks,Javascript,Node.js,Foreach,Memory Leaks,我一直在创建一个小的NodeJS应用程序,它可以遍历一个名称数组,并在API中查询名称。我遇到的问题是,数组非常大,超过400000个字,我的应用程序在forEach完成之前内存不足 通过研究JS如何处理调用堆栈、web api和回调队列,我已经能够诊断出这个问题。我认为问题在于forEach循环阻塞了调用堆栈,因此http请求继续阻塞回调队列而没有得到解决 如果有人能提供一个解决方案来解除forEach循环的阻塞,或者提供一种替代的编码方式,我将非常感谢 节点JS应用程序 检查 检查api是否
使用for循环怎么样?将数组分块成更小的数组,让forEach仅在解析前一批后启动下一批,这样就可以对这些变量进行垃圾收集。但是,由于要进行这么多调用,我建议与服务人员或其他人员并行运行脚本。是否没有允许您同时查询多个单词的API?请使用async/await语法,并感谢CRayen和@Bergi为您提供的解决方案。我已经设法让它工作,现在已经很好地掌握了异步的工作原理。
const mongoose = require("mongoose");
const fs = require("fs");
const ajax = require("./modules/ajax.js");
// Bring in Models
let Dictionary = require("./models/dictionary.js");
//=============================
// MongoDB connection
//=============================
// Opens connection to database "test"
mongoose.connect("mongodb://localhost/bookCompanion");
let db = mongoose.connection;
// If database test encounters an error, output error to console.
db.on("error", (err)=>{
console.error("Database connection failed.");
});
db.on("open", ()=>{
console.info("Connected to MongoDB database...");
}).then(()=>{
fs.readFile("./words-2.json", "utf8", (err, data)=>{
if(err){
console.log(err);
} else {
data = JSON.parse(data);
data.forEach((word)=>{
let search = ajax.get(`API url Here?=${word}`);
search.then((response)=>{
let newWord = new Dictionary ({
word: response.word,
phonetic: response.phonetic,
meaning: response.meaning
}).save();
console.log("word saved");
}).catch((err)=>{
console.log("Word not found");
});
});
};
});
});