Node.js,Mongoose函数第一次返回错误而不是第二次

时间:2014-06-16 15:30:34

标签: javascript node.js mongodb

我有一个从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:抱歉半法语,半英语代码^^

1 个答案:

答案 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
    }               
});