Определение функции обратного вызова 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 )