предупреждающее возвращаемое значение вызова ajax

(1. Считаете ли вы полезным иметь глобальный «помощник» jQuery ajax, который вы можете вызвать ajax(url,data,async)?)

function ajax(ajax_url, ajax_data, ajax_async){
  ajax_async = typeof(ajax_async) != 'undefined' ? ajax_async : true;

  $.ajax({
    type: 'GET',
    url: ajax_url,
    data: ajax_data,
    async: ajax_async,
    dataType: 'text',
    success: function(response) {
        return response;
    },
    error: function(){

    }
  });
}

Если я вызываю функцию, которая размещает GET и возвращает ответ об успехе.

alert(ajax('localhost/hello','',false);

Если я сделаю alert(get_ajax()), я получу предупреждение о «неопределенном» .. даже если было возвращаемое значение

Я вижу, что это проблема цикла событий, но я async:false в вызове ajax. мысли?


person Mike    schedule 11.11.2011    source источник


Ответы (3)


Это один из тех вопросов, который задавали миллион раз, но найти его практически невозможно. В любом случае, проблема в том, что когда ты вернешься отсюда...

success: function(response) {
    return response;
}

... вы возвращаетесь не из функции ajax(), а из анонимной функции success. Чтобы вернуть значение из основной функции, вы должны сохранить строку в переменной, чтобы вы могли вернуться из правильной функции.

var val = '';

$.ajax({
    //       ....
    success: function(response) {
       val = response;
    },
    //       ....
});

return val;

Обратите внимание, что это работает только при синхронном вызове. Для асинхронных вызовов лучше указать функцию обратного вызова в качестве аргумента и использовать ее в качестве функции успеха.

person JJJ    schedule 11.11.2011

Для синхронного вызова, я думаю, вы бы сделали

var data;
$.ajax({
    ...
    async: false,
    success: function(response) {
        data = response;
    }
});
return data;
person Doug Owings    schedule 11.11.2011

Ваша функция ajax оборачивает вызов $.ajax, ничего не возвращает: отсюда и undefined. Чтобы получить некоторое значение в вашем примере alert, вы должны добавить оператор возврата внизу вашей функции.

Чтобы получить оповещение с ответом, необходимо сделать следующее:

success: function(response) {
    alert(response);
},
person jro    schedule 11.11.2011
comment
Но мне нужно вернуть ответ. Я получаю значение, если я предупреждаю () внутри успеха, но не когда я предупреждаю () функцию ajax. - person Mike; 11.11.2011
comment
Что ж, если он асинхронный, вы не можете получить ответ напрямую, поскольку вызов ajax не блокируется: он будет доступен только после вызова функции обратного вызова success. Что бы вы ни делали с этими данными, вам придется реорганизовать свой код, чтобы его можно было обновлять с помощью обратного вызова success. Разве вы не можете переместить весь свой код, на который влияет этот вызов, для использования после завершения вызова ajax? - person jro; 11.11.2011
comment
была моя ошибка, я упустил, что я установил синхронный - person Mike; 11.11.2011