我正在尝试从我的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]}
答案 0 :(得分:2)
在我们的情况下,更好地使用waterfall代替series
和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);
});
}
答案 1 :(得分:1)
正如 Alexander 在评论中提到的,如果您想将第一个函数中的值传递给下一个函数,则应使用waterfall
代替series
。< / p>
正如有关waterfall
的官方文档中所述:
运行函数的tasks数组,每次传递 他们的结果到了数组中的下一个。但是,如果有任何任务 将错误传递给自己的回调,下一个功能不是 执行后,立即调用主回调并显示错误。
如果您想了解有关异步的各种功能的更多信息,我强烈推荐他们的官方文档(LINK)。