我有一个像这样的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中?
答案 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调用成功并且超时检查失败,则拒绝承诺。