对$http定义一个service服务
/**
* http 自定义封装
*/
ngServices.factory('httpService', function ($http, $timeout, $q) {
// 默认参数
var _httpDefaultOpts = {
method: 'POST', // GET/DELETE/HEAD/JSONP/POST/PUT
url: '',
params: {}, // 拼接在url的参数
data: {},
cache: false, // boolean or Cache object
limit: true, //是否节流
timeout : "httpTimeout", // 节流变量名
timeoutTime : 100,
isErrMsg: false,// 错误提示
isErrMsgFn : null,// 错误提示函数
checkCode: true, // 是否校验code
before: function(){}, // ajax 执行开始 执行函数
end: function(){}, // ajax 执行结束 执行函数
error: function(){}, // ajax 执行失败 执行函数
success: function(data){}, // ajax 执行成功 执行函数
checkCodeError : function(code, errMsg, data){} // ajax 校验code失败 执行函数
};
var _httpTimeoutArray = {"httpTimeout" : null};//ajax节流使用的定时器 集合
var _isErrMsgFn = function (opts) {
if (angular.isFunction(opts.isErrMsgFn)) {
opts.isErrMsgFn();
} else {
alert("抱歉!因为操作不能够及时响应,请稍后在试...");
}
};
// http请求之前执行函数
var _httpBefore = function (opts) {
if (angular.isFunction(opts.before)) {
opts.before();
}
};
// http请求之后执行函数
var _httpEnd = function (opts) {
if (angular.isFunction(opts.end)) {
opts.end();
}
if(opts.limit){
$timeout.cancel(_httpTimeoutArray[opts.timeout]);
}
};
// 响应错误判断
var _responseError = function (data, opts) {
// public.js
return checkCode(data, opts);
};
// http 请求执行过程封装 deferred :http 链式请求延迟对象
var _httpMin = function (opts, deferred) {
_httpBefore(opts);
$http({
method: opts.method,
url: opts.url,
params: opts.params,
data: opts.data
}).success(function(data,header,config,status){ //响应成功
// 权限,超时等控制
if( opts.checkCode && !_responseError(data, opts) ) {
return false;
}
// 请求成功回调函数
if(opts.success) {
opts.success(data,header,config,status);
}
if (deferred) {
deferred.resolve(data,header,config,status); //任务被成功执行
}
_httpEnd(opts);
}).error(function(data,header,config,status){ //处理响应失败
if(opts.isErrMsg){
_isErrMsgFn();
}
opts.error(data,header,config,status);
if (deferred) {
deferred.reject(data,header,config,status); //任务未被成功执行
}
_httpEnd(opts);
});
};
// http请求,内含节流等控制
var _http = function (opts, deferred) {
opts = $.extend({}, _httpDefaultOpts, opts);
var result;
if (opts.limit) {
$timeout.cancel(_httpTimeoutArray[opts.timeout]);
_httpTimeoutArray[opts.timeout] = $timeout(function () {
result = _httpMin(opts, deferred);
}, opts.timeoutTime);
} else {
result = _httpMin(opts, deferred);
}
};
// http 链式请求
var _linkHttpMin = function (opts, deferred) {
_http(opts, deferred);
};
return {
/**
* http请求
* @param opts
*/
http: function (opts) {
_http(opts);
},
/**
* http链式请求
* @param opts
* @param deferred
* @returns {deferred.promise|{then, catch, finally}}
*/
linkHttp : function (opts, deferred) {
deferred = deferred || $q.defer();
_linkHttpMin(opts, deferred);
return deferred.promise;
}
};
});
自定义响应码校验
/**
* code 响应变量定义
* @type {{SUCCESS: number, ERROR: number, SESSION_TIME_OUT: number}}
*/
var CODESTATUS = {
SUCCESS: 10000,
ERROR: -10000,
SESSION_TIME_OUT: -10001
};
/**
* 判断 code
* @param data
*/
function checkCode(data, opts){
var _data ;
var _isCode = true;
if(isEmpty(data)){
_isCode = false;
} else {
if( typeof data == "string" ){
if(data.indexOf("code") > -1){
_data = jQuery.parseJSON(data);
}else{
_isCode = false;
}
}else{
_data = data;
}
}
if( _isCode && isNotEmpty(_data.code) ){
if( _data.code == CODESTATUS.IS_NOT_LOGIN || _data.code == CODESTATUS.SESSION_TIME_OUT){// 会话超时
// 超时处理
console.log("超时或未登录");
window.location.href = _data.value;
return false;
} else if( _data.code == CODESTATUS.IS_ERROR ){
console.log("连接错误,请稍等!");
if(opts.checkCodeError){
opts.checkCodeError( _data.code, "连接错误,请稍等!", _data);
}
return false;
} else if( _data.code == CODESTATUS.USER_AUTH_FAIL ){
console.log("用户认证失败!");
if(opts.checkCodeError){
opts.checkCodeError( _data.code, "用户认证失败!", _data);
}
return false;
} else if( _data.code == CODESTATUS.PARAM_IS_ERROR ){
console.log("无效的请求参数");
if(opts.checkCodeError){
opts.checkCodeError( _data.code, "无效的请求参数!", _data);
}
return false;
}
}
return true;
}
调用例子
ngServices.service('errorService', function (httpService) {
this.getError404 = function (options) {
console.log("getError404");
var _opts = $.extend({
timeout : 'getError404Timeout'
},options);
var _url = appUrl + "code.json";
var _data = JSON.stringify({
"body": {}
});
_opts.url = _url;
_opts.data = _data;
httpService.http(_opts);
};
this.getError404Link = function (options) {
console.log("getError404Link");
var _opts = $.extend({
timeout : 'getError404Timeout'
},options);
var _url = appUrl + "code.json";
var _data = JSON.stringify({
"body": {}
});
_opts.url = _url;
_opts.data = _data;
return httpService.linkHttp(_opts);
};
});
转自http://blog.csdn.net/lzc409973859/article/details/52624880