[英]How do I extend JQuery's ajax done() method?
我有一个像这样的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中?
此代码段覆盖了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/
您可以链接超时检查器:
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调用成功且超时检查失败,则承诺将被拒绝。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.