PDA

Просмотр полной версии : Как вернуть переменные из callback функции в jQuery?


ZagZag
27.05.2009, 10:28
У меня вопрос достаточно не простой, поэтому выделю под него отдельную тему...

Объявляю глобальную переменную, получаю запрос getJSON и присваиваю ей в callback функции полученное значение.
<SCRIPT type='text/javascript'>
$(document).ready(function() {
var x = 0;
$.getJSON('./index.php?cmd=json', function(data) {
x = data.a;
alert(1)
alert(x)
});
alert(2)
alert(x)
});
</SCRIPT>
Трабла в том, что сначала выполняется alert(2) и значение переменной x = 0, а потом уже alert(1) и x принимает новое значение.
Каким образом можно задержать выполнение скрипта пока не будет присвоено значение в callback функции?

PS
Более того, если это все поместить в функцию, а после нее поставить алерт 2, то он всеравно выполнится раньше чем первый ((
Я уже обгуглился весь, ничего по теме не могу найти

MuXaJIbI4
27.05.2009, 11:10
так и должно быть alert(2) начнет выполняться сразу после того как будет отправлен запрос на сервер не дожидаясь возвращения результата ....

скажи что в итоге ты хочешь получить?

ZagZag
27.05.2009, 11:34
Мне как раз нужно как-то дождаться ответа от сервера.

getJSON у меня в функции, эта функция вызывается по событию и должна заменять глобальную переменную полученным значением

MuXaJIbI4
27.05.2009, 11:57
ну так операция внутри функции x = data.a; тебя чем то не устраивает?

ZagZag
27.05.2009, 12:10
Я так понял что после вызова getJSON выполнение скрипта продолжается дальше, данные еще не обновлены, потому-что ответ от сервера приходит не сразу.
Так вот мне как раз и нужно ждать пока сервер ответит, т. к. дальнейшее выполнение скрипта без полученных данных бессмысленно. А вот как выставить задержку пока не придут данные я не знаю.

Но быдлорешения с выставлением задержки не катят, потому-что неизвестно за какое время ответит сервер... и ответит ли он вообще

astrologer
27.05.2009, 12:19
можно так:<script type="text/javascript">
$(function()
{
var x = 0;

function next()
{
alert(2);
alert(x);
}

$.getJSON('./index.php?cmd=json', function(data)
{
x = data.a;

alert(1);
alert(x);

next();
});

});
</script>или же делать синхронный запрос :)

MuXaJIbI4
27.05.2009, 12:38
опередил :)

ZagZag
27.05.2009, 13:48
Эта функция вызывается из разных частей скрипта по нескольку раз.
А можно про синхронный запрос подробнее?

MuXaJIbI4
27.05.2009, 14:04
а какая разница сколько раз и откуда ее вызывают если это функция

astrologer
27.05.2009, 14:14
Эта функция вызывается из разных частей скрипта по нескольку раз.
А можно про синхронный запрос подробнее?
jQuery.ajax({
async: false,
url: './index.php?cmd=json',
dataType: 'json',
success: function()
{
alert(1);
}
});

alert(2); Хотя многие рекомендуют не использовать синхронные запросы, если в этом нет необходимости. Лучше логику пересмотреть.

ZagZag
27.05.2009, 17:04
Спасибо, astrologer! То что надо!
Я понимаю что с точки зрения идеологии Ajax этот код нехороший, но для отладки он мне очень сильно поможет. Пока-что требовалось чтобы скрипт выполнялся как можно более линейно.
Потом я постараюсь сделать свой скрипт на асинхронных запросах.