оповещение о возвращаемом значении вызова ajax

#jquery #jquery-events #event-loop

#jquery #jquery-события #цикл событий

Вопрос:

(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()) , я получу предупреждение ‘undefined’ .. даже если возвращаемое значение было

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

Ответ №1:

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

 success: function(response) {
    return response;
}
  

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

 var val = '';

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

return val;
  

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

Ответ №2:

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

 var data;
$.ajax({
    ...
    async: false,
    success: function(response) {
        data = response;
    }
});
return data;
  

Ответ №3:

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

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

 success: function(response) {
    alert(response);
},
  

Комментарии:

1. Но мне нужно вернуть ответ. Я получаю значение, если я alert() внутри success, но не когда я alert () выполняю ajax fnction.

2. Ну, если это асинхронно, вы не можете получить ответ напрямую, поскольку вызов ajax не блокируется: он будет доступен только после того, как будет вызвана success функция обратного вызова. Что бы вы ни хотели сделать с этими данными, вам придется провести рефакторинг вашего кода, чтобы его можно было обновлять с success обратного вызова. Разве вы не можете переместить весь свой код, на который влияет этот вызов, для использования после завершения вызова ajax?

3. это была моя ошибка, я не учел, что установил для него значение синхронный