2016-06-28 111 views
1

我試圖簡單地通過另一個函數返回查詢的結果。在下面的示例中,當我撥打gameInit時,我需要從數據庫中隨機獲取一個單詞。 grabWord函數工作正常,我可以在該函數內記錄結果。它傳遞給gameInit就是問題所在。我明白我需要使用回調,但已經失敗了很多次,所以我在這裏!Mongoose查詢返回undefined

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() { 
    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); 
    }); 
    } 
} 

或者使用承諾:

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