我一直在创建一个小型节点js应用程序,该应用程序迭代名称数组并向API查询名称。我的问题是数组非常大(400,000多个单词),并且在forEach完成之前我的应用程序内存不足。
通过研究JS如何与调用堆栈,Web API和回调队列一起使用,我已经能够诊断出该问题。我认为问题在于,forEach循环阻塞了调用堆栈,因此http请求继续阻塞回调队列而没有得到解决。
如果任何人都可以提供一种解决方案来解除forEach循环的阻塞或对该应用进行编码的另一种方式,我将非常感激。
Node JS应用
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");
});
});
};
});
});
答案 0 :(得分:1)
检查
Promises
的{{1}}执行保存操作