什么是$q服务?
$q服务是AngularJS中自己封装实现的一种Promise/deferred实现;
在Promise中,定义了三种状态:等待状态,完成状态,拒绝状态,关于状态有几个规定:
- 1 状态的变更是不可逆的
- 2 等待状态可以变成完成或者拒绝
$q.defer()方法
defer()用于创建一个deferred对象,defer.promise用于返回一个promise对象,来定义then方法。then中有三个参数,分别是成功回调、失败回调、状态变更回调。
(angular=>{
angular.module('myApp')
.service('myService',['$q','$http',($q,$http)=>{
return{
func_one:param=>{
//业务逻辑
let a='1';
//实例deferred,返回promise
let deferred=$q.defer();
let promise=deferred.promise;
if(a==='1'){
promise.resolve(a);
return promise;
}else{
promise.reject("模仿错误信息");//这相当通过 $q.reject构造的rejection 对象来解决
return promise;
}
},
func_two:param=>{
//业务逻辑
let b='2';
let deferred=$q.defer();
let promise=deferred.promise;
if(b==='2'){
promise.resolve(a);
return promise;
}else{
return $q.reject("模仿错误信息");
}
}
}
}])
.controller('myController',['$scope','myService',function($scope,myService){
$scope.func_thr=()=>{
myService.func_one()
.then(data=>{
if(data==='1'){
return myService.func_two();
}
})
.then(data=>{
alert(data);
})
.catch(error=>{
if(error){
alert(error);
}
});
}
}])
})(angular);
resolve(value):向promise对象异步执行体发送消息告诉他我已经成功完成任务,value即为发送的消息。
reject(value): 向promise对象异步执行体发送消息告诉他我已经不可能完成这个任务了,value即为发送的消息。
notify(value): 向promise对象异步执行体发送消息告诉他我现在任务完成的情况,value即为发送的消息。
$q.when();和$q.all();all():参数接收为一个promise数组,返回一个新的单一promise对象,当这些promise对象对应defer对象全部解决这个单一promise对象才会解决,当这些promise对象中有一个被reject了,这个单一promise同样的被reject了。
when():接收第一个参数为一个任意值或者是一个promise对象,其他3个同promise的then方法,返回值为一个promise对象。第一个参数若不是promise对象则直接运行success回调且消息为这个对象,若为promise那么返回的promise其实就是对这个promise类型的参数的一个包装而已,被传入的这个promise对应的defer发送的消息,会被我们when函数返回的promise对象所接收到。