Расширение JQuery AJAX успеха во всем мире

Я пытаюсь создать глобальный обработчик, который вызывается до обратного вызова ajax success. Я делаю много вызовов ajax с моим приложением, и если это ошибка, я возвращаю определенную структуру, поэтому мне нужно что-то запустить до успешного выполнения, чтобы проверить данные ответа, чтобы увидеть, содержит ли он бит кода ошибки, например 1 / 0

Образец ответа

{"code": "0", "message": "your code is broken"}

или же

{"code": "1", "data": "return some data"}

Я не могу найти способ сделать это в jQuery из коробки, посмотрел на prefilters, ajaxSetup и другие доступные методы, но они не совсем справляются, ставки, которые я могу придумать, это взлом самого метода ajax немного:

var oFn = $.ajax;

$.ajax = function(options, a, b, c)
{
    if(options.success)
    {
        var oFn2 = options.success;

        options.success = function(response)
        {
            //check the response code and do some processing
            ajaxPostProcess(response);

            //if no error run the success function otherwise don't bother
            if(response.code > 0) oFn2(response);
        }
    }

    oFn(options, a, b, c);
};

Я использовал это некоторое время, и он прекрасно работает, но мне было интересно, есть ли лучший способ сделать это, или что-то, что я пропустил в документах jQuery.

 Rob22 мар. 2012 г., 02:28
@qwertymk Я думаю, это почти то, что я сделал, хотя я предпочитаю способ, которым они обрабатывают старые функции: «return _old.apply (this, arguments);»
 qwertymk22 мар. 2012 г., 02:04
Звучит какутка штамповка
 bevacqua06 мая 2012 г., 02:54
@qwertymk приятно читать
 Joseph22 мар. 2012 г., 02:15
@Phil как насчет ошибки проверки? возвращение 4хх или 5хх кажется слишком общим.
 Phil22 мар. 2012 г., 02:07
Возвращение ошибки для статуса 200 кажется совершенно неправильным. Установите для статуса HTTP правильный код ошибки (4xx / 5xx) и используйте jQuery AJAX.error обработчик

Ответы на вопрос(5)

Вот пара предложений:

var MADE_UP_JSON_RESPONSE = {
    code: 1,
    message: 'my company still uses IE6'
};

function ajaxHandler(resp) {
    if (resp.code == 0) ajaxSuccess(resp);
    if (resp.code == 1) ajaxFail(resp);
}

function ajaxSuccess(data) {
    console.log(data);
}

function ajaxFail(data) {
    alert('fml...' + data.message);
}

$(function() {

    // 
    // setup with ajaxSuccess() and call ajax as usual
    //
    $(document).ajaxSuccess(function() {
        ajaxHandler(MADE_UP_JSON_RESPONSE);
    });

    $.post('/echo/json/');

    // ----------------------------------------------------
    //             or
    // ----------------------------------------------------

    // 
    // declare the handler right in your ajax call
    //
    $.post('/echo/json/', function() {
        ajaxHandler(MADE_UP_JSON_RESPONSE);
    });
});​

Работает:http://jsfiddle.net/pF5cb/3/

 Rob23 мар. 2012 г., 13:49
Да, но мои функции успеха не одинаковы, многие из них делают разные вещи при успешном запросе ajax.
 Rob22 мар. 2012 г., 21:56
хм, да, проблема в том, что у меня около 100 вызовов ajax, каждый с кодом «успеха», который запускается, если ответ возвращает хороший код. Я должен был бы пойти к каждой функции успеха и обернуть этот код вокруг. Я предпочитаю просто иметь чистый код в функциях успеха и не заставлять команду разработчиков беспокоиться об обёртывании этих парней, они должны работать, по крайней мере, это моя цель
 Terry23 мар. 2012 г., 02:26
ajaxHandler Функция, которую я дал, является глобальной. Вам нужно только объявить это один раз, если вы используетеajaxSuccess() вариант.
 Amyth14 июн. 2013 г., 13:59
@Rob: вы рассматривали возможность использованияcomplete функция?

аждому$.ajax() позвонить с помощьюутка штамповка техника

(function() {
    var _oldAjax = $.ajax;
    $.ajax = function(options) {
        $.extend(options, {
            success: function() {
                // do your stuff
            }
        });
        return _oldAjax(options);
     };
})();

это ваш вызов метода AJAX

 function getData(newUrl, newData, callBack) {
           $.ajax({
               type: 'POST',
               contentType: "application/json; charset=utf-8",
               url: newUrl,
               data: newData,
               dataType: "json",

               ajaxSuccess: function () { alert('ajaxSuccess'); },
               success: function (response) {
                   callBack(true, response);
                   if (callBack == null || callBack == undefined) {
                       callBack(false, null);
                   }
               },
               error: function () {
                   callBack(false, null);
               }
           });
       }

и после этого обратного вызова успех или метод успеха

$(document).ajaxStart(function () {
               alert('ajax ajaxStart called');
           });
           $(document).ajaxSuccess(function () {
               alert('ajax gvPerson ajaxSuccess called');
           });
 hemant pawar15 дек. 2015 г., 11:27
$ (document) .ajaxSuccess (function () {alert ('ajax gvPerson ajaxSuccess вызывается');});

Вот самый простой пример:

$.ajaxSetup({
    success: function(data){  
        //default code here
    }
});

Не стесняйтесь смотреть вверхдокументация на$.ajaxSetup()

 acme08 сент. 2014 г., 16:31
Он говорит: «Установите значения по умолчанию для будущих запросов Ajax.Его использование не рекомендуется."
Решение Вопроса

я ajax по умолчанию:

var ns = {};
ns.ajax = function(options,callback){ 
    var defaults = {              //set the defaults
        success: function(data){  //hijack the success handler
            if(check(data)){       //checks
                callback(data);   //if pass, call the callback
            }
        }
    };
    $.extend(options,defaults);  //merge passed options to defaults
    return $.ajax(options);             //send request
}

так что ваш звонок, а не$.ajaxВы сейчас используете;

ns.ajax({options},function(data){
    //do whatever you want with the success data
});
 Wilson Freitas24 мая 2013 г., 20:46
Хороший ответ, но есть проблема. Иногда $ .ajax используется какой-либо сторонней библиотекой, такой как Backbone.js, поэтому это решение не подойдет для этих случаев.
 Joseph28 мар. 2014 г., 16:34
@StanislavPalatnik ОП хотел изменить оригинальную функцию AJAX, чтобы все, что ее использует, получало пользовательскую конфигурацию. Мое решение просто создает новую функцию с пользовательской конфигурацией, которую OP может использовать в своем приложении глобально, но не для других библиотек.
 Stanislav Palatnik28 мар. 2014 г., 16:15
@WilsonFreitas: почему это не сработает в таких случаях? Изменяет ли Backbone оригинальную функцию $ .ajax? В противном случае я не вижу проблемы.

Ваш ответ на вопрос