处理与nodejsasynchronouscallback的循环

我是新的nodejs和mongoose。 我有一个从2009年到现在的数据库,并希望统计每个月的数据数量,并返回为json数组。 缓慢的asynchronouscallback会导致所有date为2014年8月1日

什么是适当的方式来实现呢?

var dbURL = 'mongodb://localhost/database'; var db = require('mongoose').connect(dbURL); var c_db = require('./models/models.js').c_db; var start_date = new Date(2009,0,1); end_date = new Date(2014,8,1), next_date = new Date(); var test_json=[]; var total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth()); var next_date = start_date; for(var i=0;i<total_months;i++){ var firstDay = new Date(next_date.getFullYear(), next_date.getMonth(), 1); var lastDay = new Date(next_date.getFullYear(), next_date.getMonth() + 1, 0); next_date.setDate(lastDay.getDate()+1); c_db.count({'shipdate':{'$gte':new Date(firstDay),'$lte':new Date(lastDay)}},function(err,query){ var item = { "Date": firstDay, "Count": query } test_json.push(item); }); } setTimeout(function(){ console.log(test_json); },5000); 

在使用asynchronouscallback编写javascript时要小心。 当前的asynchronous完成后,您要做的是继续循环中的下一个项目。 您可以使用“asynchronous”模块: https : //github.com/caolan/async

 var async = require("async"); var dbURL = 'mongodb://localhost/database'; var db = require('mongoose').connect(dbURL); var c_db = require('./models/models.js').c_db; var start_date = new Date(2009,0,1); end_date = new Date(2014,8,1), next_date = new Date(); var test_json=[]; var total_months = (end_date.getFullYear() - start_date.getFullYear())*12 + (end_date.getMonth() - start_date.getMonth()); var next_date = start_date; async.timesSeries(total_months, function(n, next) { var firstDay = new Date(next_date.getFullYear(), next_date.getMonth(), 1); var lastDay = new Date(next_date.getFullYear(), next_date.getMonth() + 1, 0); next_date.setDate(lastDay.getDate()+1); c_db.count({'shipdate':{'$gte':new Date(firstDay),'$lte':new Date(lastDay)}},function(err,query){ var item = { "Date": firstDay, "Count": query } test_json.push(item); next(); }); }, function(e) { console.log(test_json); });