如何将变量传递给mongodb回调?

时间:2015-01-29 19:55:36

标签: node.js node-mongodb-native

我正在尝试从我的mongodb中为两个字段选择不同的值。使用async.series,我有以下内容:

function getSettings(target){
    var versions = [];
    var result = {};

    function putResults(key, val){
        result[key] = val;
    }
  async.series(
  [
    function(callback){
        db.get(target).distinct('version', function(err, arr){
            if(err) return err;
            versions = arr;
            callback();
        }); //end db call
    },
    function(callback){
        var items;
        for(var i = 0; i<versions.length; i++)
        {
            db.get(target).distinct('instance', {version: versions[i]}, function(err, arr){
                items = arr;
                putResults(versions[i], items);
            }); //end db call
         }
     }
  ], 
  function(err){
         if(err) return err;
         console.log(result);
  }); //end async
}

使用此代码,我在putResults(versions [i],items)上得到一个“未定义”异常。我知道这是因为版本超出了范围。我的问题是:我如何在范围内得到它?

预期结果:

 result = {1: [1, 2, 3], 2: [1, 2, 3, 4]}

2 个答案:

答案 0 :(得分:2)

在我们的情况下,更好地使用waterfall代替seriesmap,就像这样

function getSettings(target){
  async.waterfall([
    function (callback) {
      db.get(target).distinct('version', function (err, versions) {
         callback(err, versions);
      });
    },
    function (versions, callback) {
      async.map(versions, function (version, next) {
        db.get(target).distinct('instance', {version: version}, function (err, items) {
          var result = {};
          result[version] = items;
          next(err, result);
        });
      }, function (err, res) {
        callback(err, res);
      });
    }
  ], function (err, result) {
    if (err) {
      return;
    } 

    console.log(result);
  });
}

答案 1 :(得分:1)

正如 Alexander 在评论中提到的,如果您想将第一个函数中的值传递给下一个函数,则应使用waterfall代替series。< / p>

正如有关waterfall的官方文档中所述:

  

运行函数的tasks数组,每次传递   他们的结果到了数组中的下一个。但是,如果有任何任务   将错误传递给自己的回调,下一个功能不是   执行后,立即调用主回调并显示错误。

如果您想了解有关异步的各种功能的更多信息,我强烈推荐他们的官方文档(LINK)。