Javascript.RU

Создать новую тему Ответ
 
Опции темы Искать в теме
  #1 (permalink)  
Старый 25.02.2015, 13:07
Интересующийся
Отправить личное сообщение для Poveritov Посмотреть профиль Найти все сообщения от Poveritov
 
Регистрация: 28.11.2011
Сообщений: 21

Как остановить работу ЦИКЛа пока функция не вернет ответ?
Столкнулся с вопросом, требуется помощь в его решении:
Есть элемент кода
function my_funct(){
	var  len = 20;
	var items;
	for (var i=0; i<len; i++){
			func_request("example_url.php",{param1:value, param2:value2}, function(answer){
				items = answer.response[0].value;
			});
		alert(items);
	}
}

в функции my_funct() выполняется цикл, по идее, с каждой итерации должна выполняться функция func_request, которая бы возвращала определенные значения.
Проблема заключается в том, что функция не успевает вернуть значения answer, а цикл продолжает работать дальше и к момент возвращения функцией значения цикл уже закончил свою работу.
При этом постоянно выводится alert пустой.

Вопрос, как сделать так, чтобы цикл увеличивал итерацию только после того, как ответ получен и передан в переменную items?
Ответить с цитированием
  #2 (permalink)  
Старый 25.02.2015, 13:19
Аватар для Skipp
.
Отправить личное сообщение для Skipp Посмотреть профиль Найти все сообщения от Skipp
 
Регистрация: 30.03.2010
Сообщений: 1,813

Выполняйте синхронные запросы
__________________
.
Ответить с цитированием
  #3 (permalink)  
Старый 25.02.2015, 13:19
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Очевидно, выполнять запрос синхронно. Как - сам уж смотри в документации этого своего func_request.
Хотя лучше так не делать - любое взаимодействие со страницей (даже простая прокрутка) заблокируется до прибытия ответа. Лучше перестраивай код на асинхронность - например, перетащи алерт в коллбек.
Ответить с цитированием
  #4 (permalink)  
Старый 25.02.2015, 13:46
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Poveritov
как сделать так, чтобы цикл увеличивал итерацию только после того, как ответ получен и передан в переменную items?
Если это краеугольная задача - выкинуть тот цикл и сделать все через setTimeout()...
Ответить с цитированием
  #5 (permalink)  
Старый 25.02.2015, 14:19
Интересующийся
Отправить личное сообщение для Poveritov Посмотреть профиль Найти все сообщения от Poveritov
 
Регистрация: 28.11.2011
Сообщений: 21

это краеугольная задача, синхронное выполнение не подойдет, так как при этом пользователь может осуществлять действия. Я рассматривал вариант setTimeout(), но там ведь вторым параметром передается время задержки... в моем случае неизвестно, через какое время сервер вернет результат. Из практики это может быть и 3 сек. и 5 сек. Можно ли как-то обойти параметр "время задержки"?
Ответить с цитированием
  #6 (permalink)  
Старый 25.02.2015, 14:20
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Работать асинхронно для слабаков?
Чтобы избежать ада коллбеков, существуют обещания. Не забудь заполифиллить для старых браузеров.
Ответить с цитированием
  #7 (permalink)  
Старый 25.02.2015, 14:22
Интересующийся
Отправить личное сообщение для Poveritov Посмотреть профиль Найти все сообщения от Poveritov
 
Регистрация: 28.11.2011
Сообщений: 21

Сообщение от ksa Посмотреть сообщение
Если это краеугольная задача - выкинуть тот цикл и сделать все через setTimeout()...
Сообщение от Erolast Посмотреть сообщение
Очевидно, выполнять запрос синхронно. Как - сам уж смотри в документации этого своего func_request.
Хотя лучше так не делать - любое взаимодействие со страницей (даже простая прокрутка) заблокируется до прибытия ответа. Лучше перестраивай код на асинхронность - например, перетащи алерт в коллбек.
Тут больше не в алерте дело, а в том, что мне нужно вытащить значение за пределы функции func_request (алерт взять для примера, чтобы показать, что переменная items не успевает принять значение).
Ответить с цитированием
  #8 (permalink)  
Старый 25.02.2015, 14:24
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

http://learn.javascript.ru/callbacks
https://developer.mozilla.org/en-US/...ts/Promise/all
Да, функции принято называть глаголами и с маленькой буквы.

Последний раз редактировалось Erolast, 25.02.2015 в 14:35.
Ответить с цитированием
  #9 (permalink)  
Старый 25.02.2015, 14:26
Аватар для ksa
ksa ksa вне форума
CacheVar
Отправить личное сообщение для ksa Посмотреть профиль Найти все сообщения от ksa
 
Регистрация: 19.08.2010
Сообщений: 14,228

Сообщение от Poveritov
Я рассматривал вариант setTimeout(), но там ведь вторым параметром передается время задержки... в моем случае неизвестно, через какое время сервер вернет результат.
setTimeout() нужен только т.с. старта всего действа. Потом все передается в колбек функции. А они у тебя вроде как есть...
При получении ответа - стартуй следующую итерацию и так далее пока "цикл не закончится"...
Ответить с цитированием
  #10 (permalink)  
Старый 25.02.2015, 14:36
Аватар для Erolast
Профессор
Отправить личное сообщение для Erolast Посмотреть профиль Найти все сообщения от Erolast
 
Регистрация: 24.09.2013
Сообщений: 1,436

Цитата:
http://learn.javascript.ru/callbacks
https://developer.mozilla.org/en-US/...ts/Promise/all
Да, функции принято называть глаголами и с маленькой буквы.
Если для запроса используется jQuery - он уже поддерживает собственную реализацию промайзов.
function fart(amount, doAfter) {
    var requests = [];
    
    for (var i = 0; i < amount; i++) {
        var request = $.post("fart.php", function(response) {
            console.log(response);
        });
        requests.push(request);
    }
    
    $.when(requests).done(doAfter)
}

fart(20, function() {
    alert("Фух... кончилось");
})


@ksa - а зачем? Асинхронность ж никуда не уходит.

Последний раз редактировалось Erolast, 25.02.2015 в 14:38.
Ответить с цитированием
Ответ



Опции темы Искать в теме
Искать в теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
как найти работу? goshala Работа 28 09.01.2017 22:59
Как узнать какая функция вызывается в браузере при наведении мыши? Бобр Элементы интерфейса 6 01.10.2012 04:01
Как разложить ответ сервера по разным div-ам? brudershaft AJAX и COMET 0 23.04.2012 20:40
Как вызывается функция? Мараторий Общие вопросы Javascript 3 22.01.2010 13:18
Как узнать, завершила ли свою работу рекурсивная функция Ajax Общие вопросы Javascript 4 13.05.2009 14:50