Используйте префильтр JQuery AJAX для проверки данных ответов и условной пересылки в обработчик событий «Ошибка» - PullRequest
6 голосов
/ 30 марта 2011

Возможно, я не совсем в курсе, но мне было интересно, можно ли использовать функциональность JQuery prefilter и анализировать данные ответов в Ajax Success и условно пересылать обработчик событий error в моем ajax вызовы, основанные на существовании определенных элементов в моем возвращенном JSON (сообщения об ошибках).

Было бы неплохо, если бы это было глобально установлено для любой функции ajax на странице.

Может быть, это не лучший способ сделать это; если у кого-нибудь есть альтернативная идея, пожалуйста, дайте мне знать!

Префильтр:

//only run prefilter on ajax calls expecting JSON back in response, would this 
//be the right way to do this? 
$.ajaxPrefilter( "json", function( options, originalOptions, jqXHR ) {
    jqXHR.success(function(data, textStatus, jXHR) {
        if( hasErrors(data) ) {
           //forward to error event handler?
        }
    });
});

Ajax call:

$.ajax({
      type:     "POST",
      data:     {  
                    theData: "someData"                    
                },
      url:      theUrl,
      dataType: 'json',
      cache:    false,          
      success:  function (data, textStatus, jqXHR) {
                    //do stuff on success
                }
      error:    function ( jqXHR, textStatus, errorThrown ) {
                    //I want to do this stuff if data contains errors from server
                } 
 });

Большое спасибо!

1 Ответ

14 голосов
/ 16 июня 2011

Вот как я это делаю: я сохраняю исходную функцию успеха (специфичную для каждого запроса), а затем присоединяю другой обратный вызов. Если не было ошибок, я вызываю исходный обратный вызов:

$.ajaxPrefilter(function( options, originalOptions, jqXHR ) {
    var originalSuccess = options.success;

    options.success = function (data) {
        if(hasErrors(data)) {
           //forward to error event handler or redirect to login page for example
        }
        else {
            if (originalSuccess != null) {
                originalSuccess(data);
            }
        }   
    };
});
...