#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. это была моя ошибка, я не учел, что установил для него значение синхронный