在async.js中链接forEachOf



第一次使用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
});

最新更新