Показать сообщение отдельно
  #6 (permalink)  
Старый 10.08.2017, 05:56
Интересующийся
Отправить личное сообщение для koha345 Посмотреть профиль Найти все сообщения от koha345
 
Регистрация: 16.04.2016
Сообщений: 28

Сообщение от Белый шум Посмотреть сообщение
Если я правильно понял ваш код, то не хватает возврата результата 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();
};
Ответить с цитированием