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

Рекурсия и возврат Promise
Имеется следующий js-файлик:
$(document).ready(function() {
	
	$("#search_posts_by_groups_form2").submit(function(e){
		e.preventDefault();
		var groupArray = new Array();
		var token = $('#token')[0].value;
		if (token.trim() == ""){alert('Введите Токен');return false;}
		var delim = $('#search_delim')[0].value;
		var groups_id = $('#search_groups')[0].value;
		// Получаем список сообществ
		var groups_arr = groups_id.split(delim);
		var groupsSize = groups_arr.length;
		var k = 0;
		var checkSum = 0;
		var groupIDArray = new Array();
		$.each(groups_arr, function(i, group_id) {
			groupIDArray[k] = group_id;
			++k;
		});
		
		var dfd = initGroupInfo(token, groupArray, groupIDArray, 0);
		dfd.done(function(){
			console.log('Закончили. Можно запускать другую функцию!')
		});
		
		
	});
});

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){
							initGroupInfo(token, groupArray, groupIDArray, ++currentGroupIDIndex);
						}else{
							console.log('Загрузка информации о группах завершена');
							dfd.resolve();
						}
				}else{
					console.log('Ошибка: initGroupInfo(2)');
				}
			}else{
				console.log('Ошибка: initGroupInfo(1)');
			}
		}
	);
	return dfd.promise();
};

function callbackGroup(token, group_id){
	return $.ajax({
		url: 'https://api.vk.com/method/groups.getById?v=5.52&access_token=' + token + '&group_id=' + group_id,
		type: 'GET',
		async: true,
		dataType: 'jsonp',
		crossDomain: true
	});
};


Я пытаюсь вызвать асинхронные запросы последовательно. Имеется список групп. Необходимо последовательно вызвать ajax и обработать полученные результаты так, чтобы выполнение следующего ajax-запроса начиналось после завершения обработки выполнения результатов предыдущего запроса. Помимо этого я хочу отследить выполнение initGroupInfo, чтобы после него запустить другую функцию. Проблема в том, что у меня мало знаний по promise и deffered.
Я не представляю, как правильно вызвать resolve и потому код не работает. Я гуглил, но те примеры, которые я встречал не имеют ничего общего с моей ситуацией.
Ответить с цитированием