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

How do I pass a variable into mongodb callback?

我正在尝试 select 我的 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) 上得到 "undefined" 异常。我知道这是因为版本超出范围。我的问题是:如何将其纳入范围?

预期结果:

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

在我们的例子中最好使用 waterfall instead of series, and map,像这样

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);
  });
}

正如 Alexander 在他的评论中提到的,如果你想将第一个函数的值传递给下一个函数,你应该使用 waterfall 而不是 series.

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

Runs the tasks array of functions in series, each passing their results to the next in the array. However, if any of the tasks pass an error to their own callback, the next function is not executed, and the main callback is immediately called with the error.

如果您想阅读更多关于 async 的各种功能,我强烈推荐他们的官方文档 (LINK)。