Вызов jquery $ .ajax успешен, но ничего не возвращает. (JSONP) - PullRequest
0 голосов
/ 01 мая 2010
$(document).ready(function() {
   $('#button').click(function() {
       try {
           var json = $.ajax({url : 'http://www.example.com/experimental/service.php', type : 'jsonp', success : function() {alert('success')}});
           alert(json);
        } catch(err) {
           alert(err.description)
        }
        var sjson = JSON.stringify(json);
       $('#display').html(sjson);
   })
}) 

После нажатия кнопки я получаю предупреждающее сообщение «успех», а также сообщение «неопределенное», ссылающееся на тот факт, что после вызова ajax ничего не было возвращено. Я проверил вкладку «net» в firebug и действительно получил успешный ответ от сервера «jsonp1272724228884 ({});» Есть идеи?

Ответы [ 2 ]

2 голосов
/ 01 мая 2010

Я бы изобразил, что alert(json); показывает неопределенное значение, поскольку он работает до получения ответа.

Помните, что «ajax» является «асинхронным», поэтому оповещение будет запущено и исполнится до того, как ваше значение json сможет получить значение.

Более того, даже если бы она работала, ваша переменная json просто ссылалась бы на созданный объект XMLHttpRequest. Если вы хотите получить доступ к самим данным, вы должны сделать это в обратном вызове.

var json;

$.ajax({
    url : 'http://www.example.com/experimental/service.php', 
    type : 'jsonp', 
    success : function(data) {
                  alert('success');
                  json = data;
                  alert(json);
              }
});

EDIT:

Существует также обратный вызов error:, который вы можете назначить. Обратный вызов будет выполнен, если сервер вернет код ошибки. Я предполагаю, что это то, что вы намеревались повторить с вашей попыткой / уловом.

1 голос
/ 01 мая 2010

Если вы хотите использовать результат сразу после обратного вызова ajax, вы должны установить атрибут async : false вызова ajax, чтобы сделать его синхронным. Поскольку это обычно не то, что вы хотите сделать, вам, вероятно, следует обрабатывать ответ другим (асинхронным) способом.

...