场景

异步请求时,用户在别处登录,当前设备下线。需要重定向。

方案

通过默认 complete 优先级

默认配置中通过 complete 兜底。如果业务代码中也写了 complete 则会覆盖此方法。
如果整个项目能自己掌控,推荐这个。

	$.ajaxSetup({
		complete: function (event, request, settings) {
			if(event.status === 401){
				top.alert(event.responseText);
				top.location.href = '/login';
			}
		}
	});

通过预过滤器重写 error 优先级

半途接手的项目,不知道在原来怎么写的。
预处理中封装默认原 error 方法。虽然不怕被覆盖了,但是重复概率太高,因为写error回调还是很常见的。有点浪费。。。

	$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
		var origError = options.error || console.error;
		options.error = (function(origError){ 
			return function(jqXHR, textStatus, errorThrown){
				if(jqXHR.status === 401){
					top.alert(jqXHR.responseText);
					top.location.href = '/login';
				}else{
					$.isFunction(origError) && origError(jqXHR, textStatus, errorThrown);
				}
			}
		})(origError);
	});

通过预过滤器重写 complete 优先级

预处理中封装默认原 complete 兜底。相对error来说complete覆盖的几率就小很多。

	$.ajaxPrefilter(function (options, originalOptions, jqXHR) {
		let origComplete = options.complete;
		options.complete = function(event, request, settings){
			if(event.status === 401){
				top.alert(event.responseText);
				top.location.href = '/login';
			}else{
				$.isFunction(origComplete) && origComplete(event, request, settings);
			}
		}
	});	

参考资料

jQuery.ajax()
jQuery.ajaxSetup()
jQuery.ajaxPrefilter()
.ajaxComplete()

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐