如何处理node.js中的循环?

时间:2013-09-18 06:06:12

标签: node.js

我在node.js中有以下代码。

var months =  ['jan','feb','march','april','may','june','july','august','sep','oct','nov','dec']
for(var i=0; j=months.length,i<j; i++){
  var start = scope.getCurrentUTS(new Date(2013, i, 1));
  var end = scope.getCurrentUTS(new Date(2013, i, 31));
  var query = {};
  query["stamps.currentVisit"] = {
        "$gte" : start.toString(),
        "$lt" : end.toString()
  };

     //connect to mongo and gets count coll.find(query).count(); working fine
  mongoDB.getCount(query,function(result) {
        console.log(result,i);  
  });
}

问题:由于代码运行异步,最后一行代码没有按预期运行。

预期输出

10 0

11 1

12 2

.......

........

40 11

但是输出为

undefined 11

1 个答案:

答案 0 :(得分:6)

您的某些查询可能与任何内容都不匹配。这就是它返回 undefined 的原因。但还有另一个问题。异步回调中的 i 可能与您的预期不符。并且可能等于 months.length 。要保持相同的 i ,您应该使用以下内容:

var months =  ['jan','feb','march','april','may','june','july','august','sep','oct','nov','dec']
for(var i=0; j=months.length,i<j; i++){
    (function(i) {
        var start = scope.getCurrentUTS(new Date(2013, i, 1));
        var end = scope.getCurrentUTS(new Date(2013, i, 31));
        var query = {};
        query["stamps.currentVisit"] = {
            "$gte" : start.toString(),
            "$lt" : end.toString()
        };
        //connect to mongo and gets count coll.find(query).count(); working fine
        mongoDB.getCount(query,function(result) {
            console.log(result,i);  
        });
    })(i);
}

也是这个

for(var i=0; j=months.length,i<j; i++){

可能只是:

for(var i=0; i<months.length; i++){