AngularJS - несколько рекурсивных вызовов $ http в цикле - PullRequest
0 голосов
/ 05 октября 2018

У нас есть иерархия людей, подобная приведенной ниже:

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

Первоначально иерархия будет свернута и выглядит следующим образом:

+ M1
+ M2
+ M3

Существует Expand AllОпция, по нажатию на нее должна развернуться все уровни в асинхронном порядке.У нас есть код, приведенный ниже, чтобы добиться этого:

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-вызов службы, чтобы получить указания данного менеджера.Проблема, с которой мы столкнулись, заключается в том, что только вызов last direct на данном уровне затрагивает службу для всех направлений этого уровня, т.е. для 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 голосов
/ 05 октября 2018

Попробуйте использовать следующее

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)
        });
    }
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...