Как остановить работу ЦИКЛа пока функция не вернет ответ?
Столкнулся с вопросом, требуется помощь в его решении:
Есть элемент кода
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? |
Выполняйте синхронные запросы
|
Очевидно, выполнять запрос синхронно. Как - сам уж смотри в документации этого своего func_request.
Хотя лучше так не делать - любое взаимодействие со страницей (даже простая прокрутка) заблокируется до прибытия ответа. Лучше перестраивай код на асинхронность - например, перетащи алерт в коллбек. |
Цитата:
|
это краеугольная задача, синхронное выполнение не подойдет, так как при этом пользователь может осуществлять действия. Я рассматривал вариант setTimeout(), но там ведь вторым параметром передается время задержки... в моем случае неизвестно, через какое время сервер вернет результат. Из практики это может быть и 3 сек. и 5 сек. Можно ли как-то обойти параметр "время задержки"?
|
Работать асинхронно для слабаков?
Чтобы избежать ада коллбеков, существуют обещания. Не забудь заполифиллить для старых браузеров. |
Цитата:
Цитата:
|
http://learn.javascript.ru/callbacks
https://developer.mozilla.org/en-US/...ts/Promise/all Да, функции принято называть глаголами и с маленькой буквы. |
Цитата:
При получении ответа - стартуй следующую итерацию и так далее пока "цикл не закончится"... ;) |
Цитата:
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 - а зачем? Асинхронность ж никуда не уходит. |
Цитата:
|
Никто не написал, что запросы в цикле - это ппц :)
|
Цитата:
|
Цитата:
|
Цитата:
function my_funct(){
var len = 20;
var i=0;
var items=0;
function iteration(answer){
items += answer.response[0].value;
if (++i<len) {
func_request("example_url.php",{param1:value, param2:value2}, iteration);
};
};
func_request("example_url.php",{param1:value, param2:value2}, iteration);
}
С setTimeout() я переборщил... :) Тут ведь асинхронные запросы, он не пригодится. :no: |
| Часовой пояс GMT +3, время: 11:54. |