我正在使用NodeJS和MongoDB数据库构建一个webapp。目前以下令我感到沮丧 - 我缺乏理解回调/(a)同步元素并仍在学习这一点,所以我认为它与这方面有关。
我有两个主要模块:
DB.js export - 此函数在单独调用时有效:
DB.GetSuggestions: function(searchTerm) {
return MongoClient.connect(url).then(function(db) {
var collection = db.collection("AccentPairs");
collection.updateMany(
{Unstressed: searchTerm},
{$inc: {QueryCount: 1}}
);
var result = collection.aggregate([
{ $match: { Unstressed: searchTerm } },
{ $group: { _id: {"WordID": "$WordID", "WordName": "$WordName", "Unstressed": "$Unstressed", "Stressed": "$Stressed", "TranslationEn": "$TranslationEn"}, Forms: { $push: "$Field" }}}
]).sort( { Chosen: -1} ).toArray();
db.close();
return result;
});
}
TextHandler.js:
var DB = require("../DB");
function ImportText(Text) {
var fullText = Text.trim();
var TextObject = {AuthorName: "", Title: "", Words: []};
var currentWord = "";
var BOS = true;
var EOS = false;
let reg = /([а-яА-ЯЁё́]+)([^а-яА-ЯЁё́]*)/g;
var result;
while (result = reg.exec(fullText)) {
BOS = EOS;
EOS = (result[2].indexOf(".") > -1);
currentWord = result[1];
WordObject = {WordText: result[1], WordID: "0", Options: [], Tail: result[2], BOS: BOS, EOS: EOS};
TextObject.Words.push(WordObject);
}
//This is what doesn't work - GetSuggestions within the loop doesn't work.
TextObject.Words.forEach(function(wd){
console.log(wd.WordText);
DB.GetSuggestions(wd.WordText).then(function(suggestions){
wd.Options = suggestions;
});
});
}
我正在尝试迭代TextObject.Words数组并使用GetSuggestions函数在数据库中搜索建议。在循环内部调用GetSuggestions并不起作用。
29335 ms:Mark-sweep 1386.5(1440.6) - > 1386.5(1440.6)MB,1156.9 / 0.7 ms [分配失败] [旧空间需求中的GC uested。 30456 ms:Mark-sweep 1386.5(1440.6) - > 1387.5(1424.6)MB,1120.6 / 0.7 ms [最后的手段gc]。 31576 ms:Mark-sweep 1387.5(1424.6) - > 1388.4(1424.6)MB,1119.4 / 0.7 ms [last resort gc]。
< --- JS stacktrace --->
==== JS堆栈跟踪======================================== =
安全上下文:000001186EBCFB49 1:/ *匿名 /(又名/ 匿名* /)[C:\ Home \ CS \ TextAnalysis \ Ezhik \ node_modules \ mongodb \ lib \ url_parser.js:~7] [p c = 000003CC6CBB279E](这= 000001186EB04381,网址= 0000004FD766F421) 2:参数适配器框架:2-> 1 3:connect(又名连接)[C:\ Home \ CS \ TextAnalysis \ Ezhik \ node_modules \ mongodb \ lib \ mongo_client.js:~390] [pc = 000 ...
致命错误:CALL_AND_RETRY_LAST分配失败 - JavaScript堆内存不足
答案 0 :(得分:1)
您不能使用Promisified GetSuggestion调用以这种方式使用forEach。请使用Promises迭代TextObject。请参阅以下链接(#mistake number 2)以了解如何在此类情况下使用Promise。
答案 1 :(得分:1)
由于您收到“JavaScript堆内存不足”错误,并且由于相关函数在循环外调用时有效,因此您会以某种方式陷入无限循环。使用while
中的TextHandler.js
循环相对容易。
我怀疑您的问题是以下一项或多项:
DB.GetSuggestions
未正确导入TextHandler.js
。如果函数不在迭代循环中,你可以确认该函数在TextHandler.js
内是否有效吗?while
循环应使用==
或===
(同时尝试两者)进行比较,而不是=
。ImportText
中,您创建了一个新的未定义变量result
,并在下一行中将其用于while
循环的比较条件。你可能不打算在这里定义result
,它可能会导致你的无限循环(假设reg.exec(fullText))
正常工作)。如果这些步骤有帮助,请告诉我。
答案 2 :(得分:1)
TextObject.Words.forEach(function(wd){ // iteration
console.log(wd.WordText);
DB.GetSuggestions(wd.WordText).then(function(suggestions){ // async block
wd.Options = suggestions;
});
});
您正在迭代异步块DB.GetSuggestions(wd.WordText)
,它不等待异步块完成并继续迭代到下一个项目。你需要Promise轻松处理异步函数。你可以Promise.all
。
我发现“Iterate over async function”的回答是您的问题最相关的