Задать вопрос
@fury2006

JS выход из for если внутри вызов функции ajax async с callback?

Помогите разобраться как можно прервать цикл и при этом вернуть результат функции внутри цикла.
Но есть нюанс: в цикле вызов функции в которой в свою очередь асинхронный ajax запрос и собственно callback
Вот не получается прервать цикл когда результат не пустой.

function sample(arr) {
  var results;
  searching:
  for (let i = 0; i < arr.length; i++) {
         results = searchingIdByName(arr[i], code, function(results) {
                        if (results !== undefined && results.id !== undefined) {
                                return results;
                        }
          });

          //тут всегда results undefined
          if (results !== undefined && results.id !== undefined) {
               console.log(results);
               break searching;
           }
  }
}
function searchingIdByName(param, code, callback) {
        $.ajax({
            url: "...",
            dataType: 'jsonp',
            type: "GET",
            delay: 250,
            data: {q: param },
            success: function(data) {
                let results = data;
                return callback(results);
            }
        });
    }
  • Вопрос задан
  • 132 просмотра
Подписаться 1 Средний 1 комментарий
Решения вопроса 1
zkrvndm
@zkrvndm
Архитектор решений
Используй async / await:
async function sample(arr) {
	
	for (var i = 0; i < arr.length; i++) {
		
		try {
			
			var result = await $.ajax({
				url: '...',
				dataType: 'jsonp',
				type: 'GET',
				delay: 250,
				data: { q: arr[i] }
			});
			
			if (result) {
				
				console.log('Получен ответ:');
				console.dir(result);
				
			}
			
			else {
				
				console.log('Получен пустой ответ:');
				console.dir(result);
				
				console.log('Прерываем цикл...');
				
				break;
				
			}
			
		}
		
		catch (err) {
			
			console.log('Ошибка:');
			console.error(err);
			
			console.log('Прерываем цикл...');
			
			break;
			
		}
		
	}

}
Ответ написан
Комментировать
Пригласить эксперта
Ответы на вопрос 1
dimovich85
@dimovich85 Куратор тега JavaScript
https://u-academy.net/
Нужно перевести это на промисы, и дальше, возможно, использовать for await of (как один из вариантов), но сразу надо думать о поддержке браузеров, хотя по идее уже все должны уметь.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы