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;//控制异步运行完成 } }} ])