如何将一个variables传递给mongodbcallback?

我试图从我的mongodb中为两个字段select不同的值。 使用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”exception。 我知道这是因为版本超出了范围。 我的问题是:我如何得到它的范围?

预期结果:

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

在我们的情况下,更好地使用瀑布而不是series ,并像这样映射

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

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

正如在有关waterfall的官方文件中指出的那样

按顺序运行函数的任务数组,每个函数将结果传递给数组中的下一个。 但是,如果任何任务将错误传递给自己的callback,则不执行下一个函数,并立即调用主callback并返回错误。

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