如何扩展JQuery的ajax done()方法?

时间:2015-09-24 01:46:55

标签: javascript jquery ajax

我有一个像这样的jQuery ajax函数:

jQuery.ajax({
            url : '/blabla',
            method : 'post',
            data: {
                bla : bla
            }
        }).done(function(data) {
            // do lots of stuff
        });

..我希望能够添加一个检查,传递给完成回调函数的数据中没有session_timed_out值。假设我有许多类似于上面的功能,但它们都做不同的事情,但是他们都需要检查会话是否先超时。有没有正确的方法来扩展done()所以它最初检查超时?我试图做这样的事情,但失败了:

var myAjax = function(options,callback){ 
    var defaults = {              
        done: function(data){  //hijack the success handler?
            if(check(data)){    
                callback(data); 
            }
        }
    };
    jQuery.extend(options,defaults);  
    return jQuery.ajax(options); 
}

当我使用这个扩展函数时,它像以前一样工作,这意味着检查永远不会被调用,因为它似乎被实际实现中的done()回调所取代,我认为这是有意义的。所以我想知道是否有办法“装饰”或扩展done()函数,因此它首先检查会话超时。或者我是否需要手动将相同的会话检查添加到我所做的所有ajax中?

2 个答案:

答案 0 :(得分:3)

此代码段会覆盖jQuery ajax方法,因此您可以在成功返回时添加额外的检查。

(function($) {

    var yourCustomCheck = function(ajaxRes) {
        // Do whatever you need and return a boolean
    };

    var oldAjax = $.ajax;
    $.ajax = function(opts) {
        return $.Deferred(function() {
            var _def = this;

            oldAjax.call(this, opts).done(function(res) {
                console.log("this is done first");
                if(yourCustomCheck.call(this, res)) _def.resolve(res);
                else _def.reject("timeout");
            }).fail(function() {
                _def.reject();
            });
        })
    }

})(jQuery);

在此之后,您可以正常使用$.ajax() ..

$.ajax({
    .....
}).done(function(res) {
    console.log("ok");
}).fail(function() {
    console.log("no ok");
});

这是一个带有工作示例的jsfiddle:https://jsfiddle.net/jormaechea/kffyo7qL/1/

答案 1 :(得分:1)

您可以链接超时检查器:

   jQuery.ajax({
        url : '/blabla',
        method : 'post',
        data: {
            bla : bla
        }
    }).then(timeoutCheck).then(function(data) {
        // do lots of stuff
    }, function(err) {
        // handle error
    });

    function timeoutCheck(data) {
        if (check(data)) {
           return data;
        } else {
           // return a rejected promise to turn fulfilled into reject
           return jQuery.Deferred.reject(new Error("timeout"));
        }
    }

或者,你可以将它放在你自己的ajax包装器中。

jQuery.ajaxT = function() {
     return jQuery.ajax.apply(jQuery, arguments).then(timeoutCheck);
}

jQuery.ajaxT(...).then(function(results) {
    // handle returned data here
    // the timeoutCheck has already been done
}, function(err) {
    // handle any errors here
});

然后,您使用jQuery.ajaxT()启动的任何ajax调用都会自动将timeoutCheck添加到其承诺逻辑中。如果ajax调用成功并且超时检查通过,则履行承诺。如果ajax调用成功并且超时检查失败,则拒绝承诺。