Javascript 节点JS forEach内存泄漏问题

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是否

我一直在创建一个小的NodeJS应用程序,它可以遍历一个名称数组,并在API中查询名称。我遇到的问题是,数组非常大,超过400000个字,我的应用程序在forEach完成之前内存不足

通过研究JS如何处理调用堆栈、web api和回调队列,我已经能够诊断出这个问题。我认为问题在于forEach循环阻塞了调用堆栈,因此http请求继续阻塞回调队列而没有得到解决

如果有人能提供一个解决方案来解除forEach循环的阻塞,或者提供一种替代的编码方式,我将非常感谢

节点JS应用程序

检查

检查api是否接受多个查询参数。 尝试使用异步承诺。 解析承诺并尝试通过Promiseall对承诺执行保存操作
使用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");
      });
      });

    };
  });

});