Определение функции обратного вызова jQuery ajax
Я хочу использовать jQuery ajax для извлечения данных с сервера.
Я хочу поместить определение функции обратного вызова успеха вне блока .ajax()
, как показано ниже. Итак, нужно ли объявлять переменную dataFromServer
следующим образом, чтобы я мог использовать возвращенные данные из обратного вызова успеха?
Я видел, как большинство людей определяют обратный вызов успеха внутри блока .ajax()
. Правильно ли следующий код, если я хочу определить обратный вызов успеха вне?
var dataFromServer; //declare the variable first
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData(dataFromServer)
})
}
function handleData(data) {
alert(data);
//do some stuff
}
Ответы
Ответ 1
Просто используйте:
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
Свойство success
требует только ссылки на функцию и передает данные в качестве параметра этой функции.
Вы можете получить доступ к своей функции handleData
, как это из-за того, как объявлен путь handleData
. JavaScript будет анализировать ваш код для объявлений функций перед его запуском, поэтому вы сможете использовать функцию в коде, которая перед фактическим объявлением. Это называется hoisting.
Это не считается для функций, объявленных таким образом:
var myfunction = function(){}
Те доступны только тогда, когда интерпретатор передал их.
См. этот вопрос для получения дополнительной информации о двух способах объявления функций
Ответ 2
"Новый" способ сделать это, поскольку jQuery 1.5 (январь 2011 г.) - использовать отложенные объекты вместо передачи обратного вызова success
. Вы должны вернуть результат $.ajax
, а затем использовать методы .done
, .fail
и т.д., Чтобы добавить обратные вызовы вне вызова $.ajax
.
function getData() {
return $.ajax({
url : 'example.com',
type: 'GET'
});
}
function handleData(data /* , textStatus, jqXHR */ ) {
alert(data);
//do some stuff
}
getData().done(handleData);
Это отделяет обработку обратного вызова от обработки AJAX, позволяет добавлять несколько обратных вызовов, отказоустойчивые обратные вызовы и т.д., без необходимости изменять оригинальную функцию getData()
. Разделение функциональности AJAX из набора действий, которые должны быть завершены впоследствии, - это хорошо!
Отсрочки также позволяют значительно упростить синхронизацию нескольких асинхронных событий, что нелегко сделать с помощью success:
Например, я мог бы добавить несколько обратных вызовов, обработчик ошибок и дождаться окончания таймера, прежде чем продолжить:
// a trivial timer, just for demo purposes -
// it resolves itself after 5 seconds
var timer = $.Deferred();
setTimeout(timer.resolve, 5000);
// add a done handler _and_ an `error:` handler, even though `getData`
// didn't directly expose that functionality
var ajax = getData().done(handleData).fail(error);
$.when(timer, ajax).done(function() {
// this won't be called until *both* the AJAX and the 5s timer have finished
});
ajax.done(function(data) {
// you can add additional callbacks too, even if the AJAX call
// already finished
});
Другие части jQuery также используют отложенные объекты - вы можете очень легко синхронизировать анимацию jQuery с другими операциями async с ними.
Ответ 3
Я не знаю, почему вы определяете параметр вне script. В этом нет необходимости. Функция обратного вызова будет вызываться с возвратными данными в качестве параметра автоматически. Очень возможно определить ваш обратный вызов вне sucess:
i.e.
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
function handleData(data) {
alert(data);
//do some stuff
}
вызывается функция handleData и передается ей параметр ajax.
Ответ 4
Попробуйте переписать ваш обработчик успеха на:
success : handleData
Свойство success метода ajax требует только ссылки на функцию.
В вашей функции handleData вы можете выбрать до 3 параметров:
object data
string textStatus
jqXHR jqXHR
Ответ 5
Я бы написал:
var dataFromServer; //declare the variable first
var handleData = function (data) {
alert(data);
//do some stuff
}
function getData() {
$.ajax({
url : 'example.com',
type: 'GET',
success : handleData
})
}
Ответ 6
после нескольких часов играет с ним и почти становится скучным. чудо пришло ко мне, оно работает.
просмотр источника страницы в приведенной ниже ссылке может помочь.
http://mintnet.net/cas242/final_project/ajax-global-variable-test.html
<pre>
var listname = [];
$.ajax({
url : wedding, // change to your local url, this not work with absolute url
success: function (data) {
callback(data);
}
});
function callback(data) {
$(data).find("a").attr("href", function (i, val) {
if( val.match(/\.(jpe?g|png|gif)$/) ) {
// $('#displayImage1').append( "<img src='" + wedding + val +"'>" );
listname.push(val);
}
});
}
function myfunction() {
alert (listname);
}
</pre>
Ответ 7
Вам не нужно объявлять переменную. Функция успеха Ajax автоматически принимает до 3 параметров: Function( Object data, String textStatus, jqXHR jqXHR )