循环中的嵌套回调

时间:2014-08-19 18:53:18

标签: javascript node.js mongodb asynchronous callback

我在Node.JS中面对这个嵌套资源访问mongodb

我需要访问资源(让我们调用" resource_a")及其相关的子资源" resource_a" (让我们来电话#34; resource_b")。 我为每个resource_a都有一组resource_b。

上面的代码无效,因为它在第一次迭代时调用了回调。 所有resourceB调用一解决,就会调用回调的最佳选择是什么? 谢谢, 弗朗

function someFunction(err, callback){
    resourceA.find({}, function(err, resources_a){
        for(var resource in resources_a) {
            resourceB.find({"resourceA_Id":resources[resource]._id}, function(err, resources_b){
             // here some operation 
             callback(null, {"result":"..."}              
        }
    });
}

1 个答案:

答案 0 :(得分:1)

您需要等到所有异步子循环都完成。

通常这是通过使用调用流程库(例如https://github.com/caolan/async)来完成的。

你可以将自己的个人快速和肮脏的加入'这样的操作:

function someFunction(err, callback){
    resourceA.find({}, function(err, resources_a){
        var waiting = resources_a.length;
        for(var resource in resources_a) {
            resourceB.find({"resourceA_Id":resources[resource]._id}, function(err, resources_b){
             // here some operation 
             waiting--;
             if (waiting == 0) {
               callback(null, {"result":"..."}
             }              
        }
    });
}

(请注意,这还没有经过测试,当resource_a为空时并没有处理这种情况,并且对所有对resourceB的调用都将调用它们各自的回调这一事实持乐观态度)