2016-06-28 5 views
1

私は単に別の関数を使ってクエリの結果を返そうとしています。下の例では、gameInitと呼ぶと、DBからランダムな単語を取得する必要があります。 grabWord関数は正常に動作し、その関数内で結果をログに記録できます。これは問題になっているgameInitに戻っています。私はコールバックを使用する必要があることを理解していますが、ここで私はそれと時間の束を失敗しました!Mongooseクエリが未定義を返す

module.exports = { 
    gameInit: function(){ 
     var theWord = module.exports.grabWord(); 
     console.log(theWord); //returns undefined 
    }, 
    grabWord: function() { 
     Word.find({}, function (err, docs){ 
      rand = Math.floor((Math.random() * docs[0].words.length)); 
      myWord = docs[0].words[rand].word; 
      return (myWord); 
      console.log(myWord); // works 

     }); 
    } 
} 

答えて

2

あなたはgrabWordにコールバック関数を渡すことができます。

module.exports = { 
    gameInit: function() { 
    var promise = module.exports.grabWord(); 
    promise.then(function(word) { 
     return word; 
    }).catch(function(err) { 
     console.error('there was an error: ' + err); 
    }) 
    }, 
    grabWord: function() { 
    return new Promise(function(fulfill, reject) { 
     Word.find({}, function(err, docs) { 
     if (err) { 
      reject(err); 
     } else { 
      rand = Math.floor((Math.random() * docs[0].words.length)); 
      myWord = docs[0].words[rand].word; 
      fullfill(myWord); 
     } 
     }); 
    }); 
    } 
} 

module.exports = { 
    gameInit: function() { 
    this.grabWord(function(word) { 
     console.log('The word is ' + word); 
    }); 
    }, 
    grabWord: function(cb) { 
    Word.find({}, function(err, docs) { 
     rand = Math.floor((Math.random() * docs[0].words.length)); 
     myWord = docs[0].words[rand].word; 
     cb(myWord); 
    }); 
    } 
} 

を代わりに、約束を使用します

関連する問題