Javascript 使用nodejs异步回调处理循环

Javascript 使用nodejs异步回调处理循环,javascript,node.js,mongodb,Javascript,Node.js,Mongodb,我对野猫和猫鼬还不熟悉。 我有一个从2009年到现在的数据库,我想统计每个月的数据数量, 并作为json数组返回。慢速异步回调结果所有日期均为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 = n

我对野猫和猫鼬还不熟悉。 我有一个从2009年到现在的数据库,我想统计每个月的数据数量, 并作为json数组返回。慢速异步回调结果所有日期均为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);
var dbURL='1〕mongodb://localhost/database';
var db=require('mongoose').connect(dbURL);
var c_db=require('./models/models.js').c_db;
var开始日期=新日期(2009,0,1);
结束日期=新日期(2014年8月1日),
下一个日期=新日期();
var test_json=[];
var total_months=(end_date.getFullYear()-start_date.getFullYear())*12+(end_date.getMonth()-start_date.getMonth());
var next_date=开始日期;

对于(var i=0;i使用异步回调编写javascript时要小心。您要做的是在当前异步完成时继续循环中的下一项。您可以使用“async”模块中的


c_db.count({'shipdate':{'gte':新日期(firstDay),'lte':新日期(lastDay)}},函数(err,query){
为什么要执行
newdate(firstDay)
?这些对象还没有日期对象吗?firstDay和lastDay在开头是硬编码的,请注意:)我想你可以定义一个回调函数,
whenFinished
,当
test\u json.length==I-1
时调用。由于闭包的原因,如果你把它放在
test\u json.push(item)
之后,即使for循环已经完成循环,它也会调用它
test\u json.push之后的行上的
应该可以工作。
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);
});