[英]In node.js, why does the second call to a function takes considerably less time than the first?
[英]Node.js, Mongoose function return an error the first time but not the second
我有一个函数可以从MongoDB数据库返回一些元素,但是我的变量有问题。 它说我的变量之一不是第一次定义,但是如果我刷新,错误就会消失。 因此,我认为这是在内部范围内定义的全局变量的错误,该范围无法首次访问或类似的东西。
所以这是我的代码:
exports.findQuestion = function findQuestion()
{
var tabRand = new Array(); // on déclare un nouveau tableau où on va stocker les jets de rand
var query = boardModel.find(null); // on cherche toutes les entrées dans la collection
query.exec(function (err, tabQuestion) {
if (err) { throw err;}
var rep = tabQuestion[0];
var rand = Math.floor((Math.random()*rep.question.length+1)); // random sur le tableau
var i = false;
tabRand[0] = 0;
while (i == false)
{
for(var random in tabRand) // on vérifie le résultat du rand avec les rand précédents
{
if(random != rand) // si le rand est différent on le garde
{
i = true;
if(tabRand.length-1 == rep.question.length) // si la taille de tabRand est égale à la longueur du tableau de questions de la collection alors on le reinitialise
{
tabRand = new Array();
}
}
}
tabRand.push[rand]; // on ajoute le rand précédent à tabRand
rand = Math.floor((Math.random()*rep.question.length+1)); // et on en fait un nouveau
}
quest = rep.question[rand-1].quest; // on récupère le resultat attendu
repJuste = rep.question[rand-1].rep_j;
repFausse1 = rep.question[rand-1].rep_f1;
repFausse2 = rep.question[rand-1].rep_f2;
gainQ = rep.question[rand-1].gain;
nomTr = rep.question[rand-1].name_t;
});
return [quest, repJuste, repFausse1, repFausse2, gainQ, nomTr];
}
所以第一次,它说任务没有定义,但是一切都很好...
PS:对不起,半法语,半英语代码^^
我在这里看到一个问题,您不能在异步函数中返回某些内容,而应该使用回调。
如果您想了解它:
您执行异步查询(并且您在回调中使用结果tabQuestion执行了某些操作)
和您返回的东西,但您不确定异步功能是否已完成。
尝试使用async.js来帮助您管理异步问题
编辑:
async.parallel([
function(callback){
boardModel.find().exec(function (err, tabQuestion) {
if (err) { throw err;}
var rep = tabQuestion[0];
var rand = Math.floor((Math.random()*rep.question.length+1)); // random sur le tableau
var i = false;
tabRand[0] = 0;
while (i == false)
{
for(var random in tabRand) // on vérifie le résultat du rand avec les rand précédents
{
if(random != rand) // si le rand est différent on le garde
{
i = true;
if(tabRand.length-1 == rep.question.length) // si la taille de tabRand est égale à la longueur du tableau de questions de la collection alors on le reinitialise
{
tabRand = new Array();
}
}
}
tabRand.push[rand]; // on ajoute le rand précédent à tabRand
rand = Math.floor((Math.random()*rep.question.length+1)); // et on en fait un nouveau
}
quest = rep.question[rand-1].quest; // on récupère le resultat attendu
repJuste = rep.question[rand-1].rep_j;
repFausse1 = rep.question[rand-1].rep_f1;
repFausse2 = rep.question[rand-1].rep_f2;
gainQ = rep.question[rand-1].gain;
nomTr = rep.question[rand-1].name_t;
});
callback(null, quest, repJuste, repFausse1, repFausse2, gainQ, nomTr);
}],
function(err){
if(err){
console.log(err);
}else{
console.timeEnd('chargement bd');
socket.emit('event', {'quest': quest, 'repJuste' : repJuste }); //add all your params
}
});
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.