我有一个从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:抱歉半法语,半英语代码^^
答案 0 :(得分:0)
我在这里看到一个问题,你不能在异步函数中返回一些东西,你应该使用回调。
如果你想了解它:
您进行异步查询(并使用结果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
}
});