JQuery неопределенный ответ - PullRequest
0 голосов
/ 05 ноября 2010

У меня есть представление, что это очень легко и чрезмерно задокументировано, но я занимаюсь этим часами подряд, и я просто не понимаю!Все, что я хочу сделать, это вернуть результат запроса $ .getJSON.Он отлично работает, если я добавляю его в div и т. Д., Но если я пытаюсь просто получить результат, я могу предупредить об этом в функции обратного вызова, но не где-нибудь еще.Я думаю, что мой код покажет, что я пытаюсь сделать:

var thumb = 
              $.getJSON('http://localhost/mapScripts/getThumbs.php?thumbnails=?',
function(data) { 
alert(data); //shows the result perfect!
var thumb = data; 
return thumb;

});

alert(thumb); //undefined

Извините заранее, если это кажется таким глупым вопросом, но я не смог его получить: (

Большое спасибо за ваше время,

Эльша

РЕДАКТИРОВАТЬ Медер и Дэвид оба дали мне отличные ответы. Я хотел бы отметить оба ответа, ноКажется, я могу выбрать только один: - /. У кого есть эта проблема, пожалуйста, посмотрите на оба ответа:)

Ответы [ 4 ]

3 голосов
/ 05 ноября 2010

Ajax является асинхронным.Вместо того, чтобы полагаться на thumb, просто вызовите функцию в обратном вызове и выполните те же функции.

var thumb = data;
anotherFunction( thumb );

В противном случае, если вы настаиваете на этой структуре, укажите async:false, хотя это убивает все преимущества Ajax.

2 голосов
/ 05 ноября 2010

Вы предприняли несколько разных попыток получить данные здесь, и они терпят неудачу по разным причинам. Я объясню почему через секунду, сначала - решение:

Все, что вы делаете с данными, должно быть сделано в функции обратного вызова.

Теперь, почему ваши попытки не работают:

Вы не можете вернуть данные из запроса Ajax.

Ajax работает (обычно), создавая объект XHR, устанавливая обработчик событий для «Когда запрос возвращается», а затем отправляя HTTP-запрос.

Вы не можете вернуть данные из него по той же причине, по которой вы не можете получить объект события, возвращенный из:

var not_the_event = jQuery('foo').click(function (event) { return event; });

Вы не можете установить значение переменной с именем thumb, которая определена вне функции, внутри функции, которая определяет thumb с помощью ключевого слова var. Ключевое слово var создает новый экземпляр переменной, которая ограничена функцией.

Если вы убрали var из функции обратного вызова, она все равно не будет работать, потому что у вас будут проблемы с синхронизацией.

Если у вас было:

var not_the_event;
jQuery('foo').click(function (event) { not_the_event = event; });
alert(not_the_event);

Тогда вы будете предупреждать undefined, поскольку при вызове alert щелчок не произошел, поэтому переменная не была установлена ​​функцией обработки событий.

При использовании Ajax запрос HTTP не был получен к моменту получения предупреждения, поэтому он также не определен.

Что возвращает нас к следующему: все, что вы делаете с данными, должно быть сделано в функции обратного вызова.

Смысл функции обратного вызова в том, что она вызывается, когда данные готовы. Так что все, что вы делаете с данными, может быть сделано тогда.

0 голосов
/ 05 ноября 2010

Прежде всего, не определяйте вторую переменную с тем же именем во внутренней области видимости:)

Что касается вашей проблемы, добавьте следующую строку перед вызовом '$ .getJSON':
$ .ajaxSetup ({async: false});

0 голосов
/ 05 ноября 2010

вы определили его локально, если вы хотите, чтобы он работал глобально, определите его глобально:

var thumb = {};
$.getJSON('http://localhost/mapScripts/getThumbs.php?thumbnails=?',
function(data) { 
alert(data); //shows the result perfect!
thumb = data; 

});

alert(thumb);

Хотя, как уже сообщали другие, лучше, чтобы обратный вызов передавал их другой функции, поскольку полагаться на глобальные переменные - плохая практика. И оповещение сработает до того, как будет выполнен Ajax.

...