Angularjs中带异步调用的广度优先搜索
我正在尝试在angularjs中实现BFS,其中每个节点都进行重新启动的调用。“while循环”的运行次数应与图中的节点数相同。但它只运行一次。在进行异步调用之后(不执行在队列中添加子节点的部分),JS引擎在循环中前进,并在队列长度为零时退出循环 在异步调用完成之前,我们如何停止执行?我们是否应该轮询异步调用是否已完成Angularjs中带异步调用的广度优先搜索,angularjs,Angularjs,我正在尝试在angularjs中实现BFS,其中每个节点都进行重新启动的调用。“while循环”的运行次数应与图中的节点数相同。但它只运行一次。在进行异步调用之后(不执行在队列中添加子节点的部分),JS引擎在循环中前进,并在队列长度为零时退出循环 在异步调用完成之前,我们如何停止执行?我们是否应该轮询异步调用是否已完成 angular.module('app', ['restangular']); angular.module('app') .controller('TestCtrl', ['
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承诺,只要队列中没有项目,您就可以立即解决该问题。您的队列检查逻辑必须在异步回调中,异步回调可能需要在下一次重新启动时将自身重新用作回调。使用队列数组角度监视的概念。