var deferred = $q.defer();\\生成deferred异步对象
deferred.resolve(rtns);\\执行到这里时,改变deferred状态为执行成功,返回rtns为从后台取到的数据,可以继续执行then,done
deferred.reject(data);\\执行到这里时,改变deferred状态为执行失败,返回data为报错,可以继续执行fail
return deferred.promise;\\起到保护作用,不允许函数外部改变函数内的deferred状态
把项目上的代码删去函数内容放上来,用于展示$q 的用法:
$q用于ajax异步请求数据的回调控制deferred
controller把数据请求发给service,service把请求给factory('myHttp',['$q',function($q){........}]);
// $q 是内置服务,所以可以直接使用,其他的是项目里有的
.factory('myHttp', [ '$rootScope', '$localStorage', '$http', '$window', '$q', '$navigate','myAlert', 'myTip',
function ($rootScope, $localStorage, $http, $window, $q, $navigate,myAlert, myTip) {
return {
post: function (param) {
//与get方式差不多,就不写了
},
get: function (param, cache) {//向服务器请求数据,并转成想要的格式。
if ("object" !== $.type(arguments[0])) throw new Error("请求参数不合法,请检查调用参数!");
var service_id = param.req.service;
var getReqHead = function (sReq) {//拼装结果的头部?
};
var jsonArryToString = function (json) {//JSON数组转成字符串?
}
var makeXmlRequestStr = function (json) {//JSON转成的字符串变成XML?
};
var makeJsonRequest = function (req) {//转成数组,遍历数组,把对象转成字符串?
};
var jsonResultCallback = function (data) {//调整数据格式,对JSON数据做一些处理,什么处理呢?
};
<span style="color:#ff0000;">var deferred = $q.defer();</span>
if(param.url){//判断param.req是json源还是xml源
jsontxt=makeXmlRequestStr(param.req);//
}else{
jsontxt=makeJsonRequest(param.req);
}
$rootScope.doing = true;
$http.get(url+"&"+$.des.encrypt(jsontxt, kencKey),//从web服务器上请求数据
{cache:cache?true:false})
.success(function(data) {
try {
$rootScope.doing = false;
var rtns;
if(!param.url){
rtns=jsonResultCallback(data);
deferred.resolve(rtns);
}else{
rtns=data;
if(rtns.IRETCODE == 0) {
deferred.resolve(rtns);
} else {
myTip(rtns.IRETINFO);
}
}
} catch (e) {
throw new Error(e.message);
}
})
.error(function(data) {
deferred.reject(data);
});
return deferred.promise;//控制异步运行完成
}
}
} ])