Как вернуть значение из обработчиков успеха и ошибок в jQuery.ajax () в родительский метод? - PullRequest
1 голос
/ 19 июля 2011

Хорошо, давайте поспорим, что вызов AJAX ДОЛЖЕН БЫТЬ АСИНХРОННЫМ .

По сути, у меня есть вызов jQuery AJAX, и я хочу, чтобы обработчики успеха и ошибок возвращали значение родительскому методу:

Приведенный ниже код не работает, поскольку вызов AJAX является асинхронным. Таким образом, возвращаемое значение в нижней части функции возвращается до получения ответа:

var isValid = false;

$.ajax({
    type: "POST",
    url: myurl,
    dataType: "JSON",
    data: $myData,
    async: true,
    success: function(data) {
        isValid = true;
    },
    error: function() {
        isValid = false;
    }
});

return isValid;

Итак, есть ли способ передать значение BACK вызывающему методу для асинхронных вызовов AJAX?

Ответы [ 4 ]

2 голосов
/ 21 июля 2011

Вот решение, которое я нашел, которое отвечает на мой вопрос .... (Спасибо @Rodaine за предоставленную мне идею!)

В методе вызова я указываю функцию обратного вызова.Вот плагин, который содержит вызов AJAX:

function ajaxCall(options) {
    var url = options["url"] === undefined ? "" : options["url"];
    var addLink = options["addLink"] === undefined ? "" : options["addLink"];

    var $form = $(this).closest("form");
    var $formParamsString = $form.serialize();

    var aSuccess = [];
    var aError = [];

    if ($.isFunction(options["success"])) 
        aSuccess.push(options["success"]);

    if ($.isFunction(options["error"])) 
        aError.push(options["error"]);

    $.ajax({
        type: "POST",
        url: url,
        dataType: "JSON",
        data: $formParamsString,
        async: true, // Asynchronous to allow for loading image
        success: aSuccess,
        error: aError
    });
}

Теперь, когда я вызываю эту функцию, я могу указать обратный вызов в опциях Object:

ajaxCall({
    url: "myWebService.cfm",
    success: function() {
        alert("We did it!");
    },
    error: function() {
        alert("Try again, fool!");
    }
});
1 голос
/ 19 июля 2011

Линия

Return isValid; 

Выполнится до завершения вызова, потому что он асинхронный.

Используйте

async: false,
0 голосов
/ 19 июля 2011

Вы не можете сделать это, потому что isValid всегда будет ложным.

Если вам нужно что-то сделать после успеха / неудачи, вы должны сделать:

success: function(data) {
    isValid = true;
    otherFunction(isValid);
},
error: function() {
    isValid = false;
    otherFunction(isValid);
}

Таким образом, вы могли быобрабатывать разные случаи

0 голосов
/ 19 июля 2011

Использовать синхронный вызов ajax

установить асинхронное значение на ложь.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...