2016-06-28 94 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); 
     } 
     }); 
    }); 
    } 
}