Так что, похоже, вы работаете против асинхронного характера JavaScript. в случае вышеперечисленных функций они не будут выполняться в том порядке, в котором вы написали (и вы тоже этого не хотели бы!), потому что они асинхронны. Есть несколько простых решений, которые помогут вам разобраться в проблеме.
Решение 1: Вложенные обратные вызовы. Трудно читать. Кроме того, он ждет завершения первого, прежде чем стрелять вторым, возможно, замедляя все.
app.get('/ratings', function(req, res) {
var review = {};
db.database.find({rating:5}).count(function(err, doc) {
review.FiveStarCount = doc;
db.database.find({rating:4}).count(function(err, doc) {
review.FourStarCount = doc;
// DO something with data
res.json(review);
});
});
Решение 2: Защелка. Это имеет то преимущество, что запросы выполняются параллельно и не так ужасны для чтения.
app.get('/ratings', function(req, res) {
var review = {};
db.database.find({rating:5}).count(function(err, doc) {
review.FiveStarCount=doc;
if (review.FiveStarCount && review.FourStarCount) {
// DO something here
// Will only execute if the other has finished
}
});
db.database.find({rating:4}).count(function(err, doc) {
review.FourStarCount=doc;
if (review.FiveStarCount && review.FourStarCount) {
// DO something here
// Will only execute if the other has finished
}
});
});
Есть, конечно, больше решений, таких как, возможно, лучший запрос или обещания. Возможно, прочитайте немного больше о async JavaScript here, чтобы получить лучшее понимание.
* Кажется, у меня проблемы с работой * Можете ли вы уточнить? – Rayon
Хотя я не могу сказать, посмотрев на ваш код..find - это асинхронная функция - обратные вызовы не выполняются в том порядке, в котором вы их написали, они происходят в произвольные моменты времени. Если вы не используете защелку или обещание (или вложенные обратные вызовы), вы не сможете получить оба. Пожалуйста, поделитесь больше своего кода –