第一次使用async.js,感觉就像我完全错过了一些东西,因为我通过蛮力进入了工作状态,我不相信它会与任何其他数据集一起工作。我很想知道这里是否有什么我没看到的。
我有一个对象数组,每个对象都包含一个数组。我想遍历子数组,在调用mongo时使用它,并在它们全部返回后对结果进行处理。数据如下所示:
productVersions: [
versionA: {
relevantField: [
{
relevantId: value
},
{
relevantId: value
}
]
},
versionB: {
relevantField: [
{
relevantId: value
},
{
relevantId: value
},
{
relevantId: value
}
]
}
];
在代码中,我想在productVersions
中对relevantField
中的每个对象进行调用,并且在为两个版本进行了所有调用之后,用结果做一些事情。代码看起来像这样:
async.forEachOf(productVersions, function(version, versionIndex, versionCallback){
async.forEachOf(relevantField, function(object, objectIndex, objectCallback){
Users.findById(object.relevantId, function(err, model){
// get some information from mongo
objectCallback();
});
}, function(){
versionCallback();
});
}, function(err){
// Do something with all the results
});
这恰好是功能现在,但我有一种感觉,这是因为时间和运气,如果调用较慢,如果有更多的数据,它将无法工作。我做错什么了吗?有没有更好的方法?
作为一个async
的维护者对我来说看起来很好,尽管我个人倾向于让我把这些功能分开。你也可以考虑使用瀑布/系列来管理这个流程
function processRelevantField(object, objectIndex, objectCallback){
Users.findById(object.relevantId, function(err, model){
// get some information from mongo
objectCallback();
});
}
function processVersion(version, versionIndex, versionCallback){
async.forEachOf(relevantField, processRelevantField, function(){
versionCallback();
});
}
async.forEachOf(productVersions, processVersion, function(err){
// Do something with all the results
});