Angularjs中带异步调用的广度优先搜索

Angularjs中带异步调用的广度优先搜索,angularjs,Angularjs,我正在尝试在angularjs中实现BFS,其中每个节点都进行重新启动的调用。“while循环”的运行次数应与图中的节点数相同。但它只运行一次。在进行异步调用之后(不执行在队列中添加子节点的部分),JS引擎在循环中前进,并在队列长度为零时退出循环 在异步调用完成之前,我们如何停止执行?我们是否应该轮询异步调用是否已完成 angular.module('app', ['restangular']); angular.module('app') .controller('TestCtrl', ['

我正在尝试在angularjs中实现BFS,其中每个节点都进行重新启动的调用。“while循环”的运行次数应与图中的节点数相同。但它只运行一次。在进行异步调用之后(不执行在队列中添加子节点的部分),JS引擎在循环中前进,并在队列长度为零时退出循环

在异步调用完成之前,我们如何停止执行?我们是否应该轮询异步调用是否已完成

angular.module('app', ['restangular']);

angular.module('app')
.controller('TestCtrl', ['$scope','Restangular', '$q',
  function($scope,Restangular,$q) 
  {
    var defer = $q.defer();
    var queue = [];
    queue.push(0);


    //A set to track visited nodes
    var visited = {};

    while(queue.length != 0)
    {   
        var item = queue.shift();
        console.log("in while loop");

        //for each unvisited node, make a rest call to get it's children, then add them to queue and mark that node as visited
        if(!(item in visited)){
            defer.promise.then(Restangular.one('/some/path/getChildren',item).get().then(function()
            {
                //This part of code is executed only 1 time.
                console.log("made rest call for "+item);
                //each item can have 0 or 1 or 2 children
                queue.push(item.children);
                visited[item]=true;
            }
            ));
        }
    }
  }
]);

在JS中不能这样做-异步调用将在函数完成后进行。您需要做的是有一个$q承诺,只要队列中没有项目,您就可以立即解决该问题。您的队列检查逻辑必须在异步回调中,异步回调可能需要在下一次重新启动时将自身重新用作回调。

使用队列数组角度监视的概念。