AngularJS-循环中的多个$ http递归调用

时间:2018-10-05 13:16:29

标签: angularjs ajax http asynchronous recursion

我们的人员如下所示:

M1
    A1
        AA1
            AAA1
    A2
        AA2
            AAA2
    A3
        AA3
M2
    B1
        BB1
            BBB1
    B2
        BB2     
M3
    C1
    C2
    C3

最初,层次结构将被折叠,因此如下所示:

+ M1
+ M2
+ M3

有一个“全部展开”选项,单击后应以异步方式展开所有级别。我们有以下代码可以实现这一目标:

function expandAll() {
    expandAll(mainDirects);           
}

function expandAll(directs){
    if(!directs){
        return;
    }
    _.each(directs, function (direct){
        if(direct.IsManager){
            direct.expand().then(function(node){
                expandAll(node.directs)
            });
        }
    });
}

direct.expand()是一种对服务进行http调用以获取给定管理器的指令的方法。我们遇到的问题是,只有给定级别的最后一个直接呼叫才打入该级别所有直接呼叫的服务,即对于M1和M2,显示的层次结构是M3的层次结构(如下所示)。由于是递归,因此在更高级别上也发生了同样的事情,因此A1和A2的继承关系就是A3的继承关系。

M1
    C1
        AA3
    C2 
        AA3
    C3
        AA3
M2
    C1
        BB2
    C2
        BB2
    C3     
M3
    C1
    C2
    C3

看起来像$http排队所有请求,只有最后一个被执行N次。知道如何解决这个问题吗?

谢谢!

1 个答案:

答案 0 :(得分:0)

尝试使用以下内容

var k = 0;
_.each(directs, function (direct){
    (function(k) {
        if(direct.IsManager){
            direct.expand().then(function(node){
                expandAll(node.directs);
                k++;
            });
        }
    })(k);
});

代替

_.each(directs, function (direct){
    if(direct.IsManager){
        direct.expand().then(function(node){
            expandAll(node.directs)
        });
    }
});