Можете ли вы остановить отложенный обратный вызов в jquery 1.5? - PullRequest
2 голосов
/ 03 марта 2011

Мне интересно сказать, у вас есть что-то вроде этого

// Assign handlers immediately after making the request,
// and remember the jqxhr object for this request
var jqxhr = $.ajax({ url: "example.php" })
    .success(function(response) { alert("success"); })


// perform other work here ...

// Set another success function for the request above
jqxhr.success(function(response){ alert("second success"); });

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

Эта функция в основном выполняет проверку на наличие ошибок при проверке сервера. Если он это сделал, он форматирует его и отображает сообщение.

Теперь мне интересно, могу ли я как-нибудь использовать вторую функцию успеха, чтобы потом делать конкретные вещи. Как, скажем, один ajax-запрос должен добавить строку в таблицу. Так что это должно быть возможно. Я просто делаю то, что у меня выше, и во втором успехе я просто добавляю строку.

Возможно ли, однако, что если первый успех проходит и видит, что на сервере есть ошибки проверки, что я могу остановить второй успех?

Вроде

If(first success finds errors)
{
   // print out errors
   // don't continue onto next success
}
else
{
   // go to next success 
}

Редактировать

Я обнаружил, что есть что-то, вызывающее deferred.reject , и это действительно останавливает это, но мне интересно, как я могу указать, чтобы остановить только один успех. Так как я думаю, что если есть другие отложенные, такие как завершенные, будет ли отклонено тоже?

Ответы [ 3 ]

0 голосов
/ 03 марта 2011

AFAIK нет, вы не можете использовать отложенный объект ( с jQuery v1.5 .ajax() объекты расширяют отложенные объекты ), как это.

Когда вы добавляете обратные вызовы к вашему отложенному объекту , то есть .success(....., они складываются.Как только ваш отложенный объект разрешит ( после успешного завершения ajax ), он запустит все обратные вызовы, которые были сложены.Слишком поздно пытаться и отклонить объект, например, чтобы прекратить выполнение любых успешных обратных вызовов. Взгляните на пример здесь

Может быть, лучше выполнить необходимую логику в функции успеха и вызвать функцию-оболочку, котораяпозаботится о любых повторяющихся действиях и призовет вас к успеху, если ваши логические тесты пройдут.


Обновление в соответствии с комментариями:

var cs = true;
var jqxhr = $.ajax({ 
    beforeSend: function(){
        cs=true;
    },
    url: "/echo/json/" 
})

.success(function(response) { 
    if(cs)
    alert("success"); 
})

.success(function(response) { 
    if(cs)
        cs = false;
        alert("success 2"); 
})

.success(function(response) { 
    if(cs)
        alert("success 3"); 
});

Использование логики для уничтожения обратных вызовов.

0 голосов
/ 03 марта 2011

Если у вас есть только одна функция проверки правильности, вы можете создавать свои собственные отложенные и привязывать к ним обработчики, а не напрямую к запросу ajax.

Этот пример дает один уровень проверки, если вы хотите связать их вместе, вам может понадобиться другой шаблон.

var validated = function(jqxhr, validationFunction){
    var myDeferred = new $.Deferred();
    var doValidation = function(){
        var result = validationFunction.apply(this, arguments);
        if (result){
            myDeferred.resolve(arguments);
        }
        else
        {
            myDeferred.reject(arguments);
        }
    };

    jqxhr.success(doValidation);
    return myDeferred;
};

var jqxhr = $.ajax({ url: "/echo/json/"});
var vtest = validated(jqxhr, function(response){
    //Do your validation check here,
    //return true if it passed, false if it failed.
    return false; 
});

//attach your handlers to vtest
vtest.done(function(response){alert("yay");});
vtest.fail(function(response){alert("drats");});
0 голосов
/ 03 марта 2011

Вызовите вторую функцию успеха, когда ваша первая функция успеха оценивает ответ на вызов AJAX и определяет, что она соответствует вашим требованиям

пример:

$.post('example.php', {name_1: value_1, name_2: value_2}, function(response){
  //this code gets executed when the AJAX request was successful

  //do some more stuff

  //check the response
  if(response == 'success'){
    second_success_function(response);
  }
});

В этом примере предполагается, что вы получаете строку «success», когда все прошло как запланировано.

Второй аргумент в вызове $ .post - это карта значений, которые вы передаете скрипту. Это необязательно.

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

http://api.jquery.com/ajaxStop/

...