Сообщение от Белый шум
|
Если я правильно понял ваш код, то не хватает возврата результата dfd по всей цепочке рекурсии. И реджектов в случае ошибки:
if ( (groupIDArray.length - currentGroupIDIndex) > 1){
*!* dfd = */!* initGroupInfo(token, groupArray, groupIDArray, ++currentGroupIDIndex);
}else{
console.log('Загрузка информации о группах завершена');
dfd.resolve();
}
}else{
console.log('Ошибка: initGroupInfo(2)'); *!* dfd.reject(); */!*
}
}else{
console.log('Ошибка: initGroupInfo(1)'); *!* dfd.reject(); */!*
}
Ну и обработка ошибки:
dfd.done(function(){
console.log('Закончили. Можно запускать другую функцию!')
})
*!* .fail(function(){ */!*
*!* console.log('ошибка'); */!*
*!* }); */!*
Хотя лучше бы вы выложили ваш пример на https://jsfiddle.net/ чтобы там можно было сразу проверить.
|
Выложить не могу, к сожалению.
Конечное сообщение после выполнения initGroupInfo не выходит. Мне кажется, в ходе рекурсии первый вызов не вызывает resolve. Т.е. deffered теряется и никогда не вызывается, а на последнем шаге он вызывается, но возвращается в предыдущий вызов, но там никакого обработчика нет.
Написал вот так, но такой способ вернет ответ после первого вызова. Получается, надо как-то передавать предыдущий deffered.
(Код ниже вернет результат после первого же вызова)
function initGroupInfo(token, groupArray, groupIDArray, currentGroupIDIndex){
var dfd = $.Deferred();
var group_id = groupIDArray[currentGroupIDIndex];
var promisedCalbackGroup = callbackGroup(token, group_id);
promisedCalbackGroup.done(
function(data){
var obj = data.response;
if (obj){
if (obj[0]){
group_id = groupIDArray[currentGroupIDIndex];
groupArray[group_id] = new Object();
groupArray[group_id].group = obj[0];
console.log('Загрузка информации о группе: ' + group_id);
if ( (groupIDArray.length - currentGroupIDIndex) > 1){
var dfd1 = initGroupInfo(token, groupArray, groupIDArray, ++currentGroupIDIndex);
dfd1.done(
new function(){
dfd.resolve();
}
);
}else{
console.log('Загрузка информации о группах завершена');
dfd.resolve();
}
}else{
console.log('Ошибка: initGroupInfo(2)'); dfd.reject();
}
}else{
console.log('Ошибка: initGroupInfo(1)'); dfd.reject();
}
}
);
return dfd.promise();
};