Я написал небольшой код для загрузки дерева последователей из GitHub.Как изменить рекурсивный метод на нерекурсивный в js
Это хорошо работает для моей рекурсивной версии, но я не могу запустить свою версию «stack-que».
Получаю ответ после того, как я закончу свой цикл, который является проблемой: в моем рекурсивном решении используется один и тот же метод loadFollowers, но из-за его структуры вызовов он генерирует желаемое дерево.
Должен ли я каким-то образом отключить асинхронный вызов?
function loadFollowers(user,field,callback){
path = 'https://api.github.com/users/'+user.info[field]+'/followers';
path += '?client_id=' + pass.client_id + '&client_secret='+pass.client_secret
console.log("path:"+path+' field: '+field+' node: '+user);
$.get(path,function(followers){
for(var i = 0;i < followers.length; i++){
current = new Node();
current.info = followers[i];
user.addFollower(current);
callback();
};
});
}
function loadNetworkNonROld(node,depth,field){
var toVisit = [];
var visited =[];
var deep;
var current;
var curr;
toVisit.push([node,depth]); // saves [node,level] to control how deep it is
// starts at initial node
while (toVisit.length > 0){
curr = toVisit.shift();
current = curr[0];
deep = curr[1];
if((visited.indexOf(current.info[field])===-1) && (deep > 0)){
visited.push(current.info[field]);
loadFollowers(current,field,function(){
for(var i=0;i < current.followers.length; i++){
toVisit.push([current.followers[i],deep-1]);
}
});
}
}
return visited;
}
рекурсивная версия, которая работает просто отлично ниже:
function loadNetwork(node,depth,field){
loadFollowers(node,field,function(){
if (depth == 0){return;}
for(var i=0; i < node.followers.length; i++){
current = node.followers[i];
id = current.info[field];
if (networkAllUsers.indexOf(id)===-1)
{
networkAllUsers.push(id);
console.log(id);
loadNetwork(current,depth-1,field);
}
}});
}
GitHub ссылка: https://github.com/marcinwal/myownnode.git и код находится в общественном/JavaScript/main.js файл.
Где находится код проблемы? Вы показываете функцию 'loadNetworkNonROld()', но она никогда не используется. Также упоминайте 'stack-que', но что это? Общий вопрос не совсем понятен. Не всегда полезно использовать 'async: false' – charlietfl
, он используется в $ ('# formdepth'). On ('submit', function (event) { event.preventDefault(); depth = $ (' #depth ').Val(); // loadNetwork (пользователь, глубина, 'login'); networkAllUsers = loadNetworkNonROld (пользователь, глубина, 'login') }); – marcinwal
Можете ли вы объяснить, почему вы хотите использовать нерекурсивную функцию, когда у вас уже есть рекурсивный, который делает то, что вам нужно? – Tomalak