来自循环的mongoose查询的结果不会更新node.js中的结果数组

时间:2016-05-05 05:30:03

标签: node.js function mongoose callback

var row = ['570eb3c03a118b071fa6e487','570eb3c03a118b071fa6e488','570eb3c03a118b071fa6e489'];
var gridItemsFound=[]
for (var i = 0; i < rows.length && numOfGrids != noOfgridFound; i++) {
   var row_id = rows[i];
   (function (row_id) {
     grids.findOne({'_id': row_id}, function (err, result) { 
       for (var j = 0; j < result.cols.length && numOfGrids!=noOfgridFound; j++) {

         if (result.cols[j].purchased == false){
           noOfgridFound++;
           gridItemsFound.push({row: row_id, col: result.cols[j].id});
         }
       };
     });
   })(row_id);
 };
 console.log(gridItemsFound);
  

将所有结果推送到数组后,当我在循环后控制它时,它不会改变。

1 个答案:

答案 0 :(得分:0)

findOne操作是I / O绑定的,这意味着对数组的更新将发生异步,在一个坚果shell中这意味着你的循环将在你的回调运行之前完成这意味着此时不会对阵列进行更新。

总而言之,你有效地需要在继续之前等待所有回调运行,我建议使用async lib,因为它有助于摆脱大量锅炉板代码

var rows = [...]
async.map(rows, function(rowId, callback) {
    grids.findOne({'_id': rowId}, function (err, result) {
        if (err) {
            callback(err);
        } else {
            var notPurchased = result.cols.filter(function(col) {
                return !col.purchase;
            }).map(function(col) {
                return { row: rowId, col: col.id };
            });
            noOfGridFound += notPurchased.length;
            callback(null, notPurchased);   
        }
    });
}, function(err, results) {
    if (err) {
        console.error(err);
    } else {
        console.log(results);
    }
});