对jQuery ajax请求成功(失败)回调执行前的统一处理

对jQuery ajax请求成功(失败)回调执行前的统一处理(兼容较,有需要的朋友可以参考下。
目前的项目中有这样的需求,如果用户的状态因已登录太久已经失效(登录超时,用户自己不知道),用户在操作发起一个ajax请求的时候服务端是无法返回有效数据的,而ajax请求的状态还是成功,会执行配置项里的success函数参数或者done的异步回调。这时需要我们在请求成功后判断用户是否已经登录超时,在每一个ajax的成功回调里加是不现实的的,我们需要做统一处理。
执行成功回调有两种格式,一种是放在ajax参数里面,如下:
$.ajax({ url:'getData.jsp', success:function(data){ // 处理成功回调 }, error:function(a,b,c){ alert("请求失败:"+b); } });
另一种是在较新的jQuery版本里所支持的异步回调格式:
$.ajax({ url:'getData.jsp', dataType:'JSON' }).done(function(data){ // 处理成功回调 }).fail(function(a,b,c){ alert('请求失败:'+b); });
如果我们能够截获到所返回的data数据,然后判断其某个属性值是否是超时状态值即可,如果是则可以跳转到登陆页。针对以上两种格式的成功回调我们都可以处理,代码如下:
var ajax = $.ajax; $.ajax = function (opt) { //备份opt中error和success方法 var fn = { success: function (data, textStatus, jqXHR) { } } if (opt.success) { fn.success = opt.success; } //扩展增强处理 var _opt = $.extend(opt, { success: function (data, textStatus, jqXHR) { //alert('重写success事件'); if (data.status == '408') { location.href = '/service/login/LogoutForWeb.jsp'; return; } fn.success(data, textStatus, jqXHR); } }); var def = ajax.call($, _opt); // 兼容不支持异步回调的版本 if('done' in def){ var done = def.done; def.done = function (func) { function _done(data) { if (data.status == '408') { location.href = '/service/login/LogoutForWeb.jsp'; return; } func(data); } done.call(def, _done); return def; }; } return def; };
其实这种对原有的功能函数做进一步包装的处理方式的确可以解决很多问题,遇到要在全局统一处理得问题都可以采取此种思路来做处理。另外,对于一些库内部实现机制的了解真的有助于我们解决一些比较特殊的需求,这也许就是你会比别人更厉害的地方。

Leave a Reply

电子邮件地址不会被公开。 必填项已用*标注