I'm trying to create a global handler that gets called before the ajax success callback. I do a lot of ajax calls with my app, and if it is an error I return a specific structure, so I need to something to run before success runs to check the response data to see if it contains an error code bit like 1/0
Sample response
{"code": "0", "message": "your code is broken"}
or
{"code": "1", "data": "return some data"}
I can't find a way to do this in jQuery out of the box, looked at prefilters, ajaxSetup and other available methods, but they don't quite pull it off, the bets I could come up with is hacking the ajax method itself a little bit:
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);
};
I've been using this for a while and it works fine, but was wondering if there is a better way to do it, or something I missed in the jQuery docs.
You can build your own AJAX handler instead of using the default 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
}
so your call, instead of $.ajax, you now use;
ns.ajax({options},function(data){
    //do whatever you want with the success data
});
                        This solution transparently adds a custom success handler to every $.ajax() call using the duck punching technique
(function() {
    var _oldAjax = $.ajax;
    $.ajax = function(options) {
        $.extend(options, {
            success: function() {
                // do your stuff
            }
        });
        return _oldAjax(options);
     };
})();
                        Here's a couple suggestions:
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);
    });
});
Working: http://jsfiddle.net/pF5cb/3/
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With