在async.js中链接forEachOf

时间:2016-07-06 00:04:47

标签: node.js mongoose async.js

第一次使用async.js,感觉我只是完全错过了一些东西,因为我通过蛮力进入工作状态,我不相信它会与任何其他数据集一起工作。很想知道我有没有在这里看到的东西。

我有一个对象数组,每个对象都包含一个数组。我想迭代子数组,在调用mongo时使用它,并在它们全部返回后对结果做一些事情。数据如下所示:

数据

productVersions: [
    versionA: {
        relevantField: [
            {
                relevantId: value
            },
            {
                relevantId: value
            }
        ]
    },
    versionB: {
        relevantField: [
            {
                relevantId: value
            },
            {
                relevantId: value
            },
            {
                relevantId: value
            }
        ]
    }
];

在代码中,我想调用relevantFieldproductVersions中的每个对象,并且在对两个版本进行了所有调用之后,对结果执行一些操作。代码如下所示:

代码

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

这恰好可以正常使用,但我感觉这是因为时间和运气,如果有更多的数据,那么调用速度较慢,那就不行了。我在这里做错了吗?有更好的方法吗?

1 个答案:

答案 0 :(得分:0)

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