CommonJS Promise标准
Promise分为两个部分
Deferred用于作为通信对象,分为三个状态:开始,处理和结束.
Promise是Deferred响应数据的输出,同样拥有等待,执行和拒绝以及相应的回调函数.
$q
angular中能够帮你异步运行function的一项服务,当它们的处理线程完毕后,可以使用它们的返回值.
最新的ES6 style promise 本质上就是使用$q作为一个构造器(resolve function做为第一个参数).
1 var defer = $q.defer(); 2 3 var promise = defer.promise; 4 5 promise.then(function (val) { 6 7 console.log(val); 8 9 var a = "1";10 11 return $q.when(a);12 13 }).then(function (someThing) {14 15 console.log(someThing);16 17 });18 19 $timeout(function () {20 21 defer.resolve("success");22 23 }, 1000);24 25 // 这只是个简单的例子,说明可将将普通对象当做promise对象处理
Deferred API
通过调用$q.defer()来创建一个deferred对象.
deferred对象的目的是显示关联的Promise实例和API,用来发送成功和失败完成的信号和任务完成的情况.
Methods
resolve(val)
reject(reason)
notify(value)
Properties
Promise API
当一个deferred对象创建好之后,一个新的Promise对象实例就会被创建,可以通过deferred.promise得到.
promise对象的目的是允许获取deferred执行完成之后的结果.
Methods
then(successCallBack, errorCallBack, notifyCallBack)
catch(errorCallBack) ----可以使用catch捕获deferred.reject(reason),与then中的errorCallBack功能一致.
finally(callBack, notifyCallBack)
1 var defer = $q.defer(); 2 3 var promise = defer.promise; 4 5 promise.then(function (val) { 6 7 console.log(val); 8 9 }).catch(function (msg) {10 11 console.error(msg);12 13 });14 15 $timeout(function () {16 17 defer.reject("error");18 19 }, 1000);
Promise链
通过调用then方法,promise可以返回一个新派生的promise对象,用于接下来的then()使用.
1 var defer = $q.defer(); 2 3 var promise = defer.promise; 4 5 promise.then(function (val) { 6 7 console.log(val); 8 9 var innerDeferred = $q.defer();10 11 innerDeferred.resolve("inner");12 13 return innerDeferred.promise;14 15 }).then(function (msg) {16 17 console.log(msg);18 19 });20 21 $timeout(function () {22 23 defer.resolve("success");24 25 }, 1000);
注:如果在then的回调函数中不返回一个新的promise对象或其它对象,则默认为返回undefined.
大家有什么疑问可留言提问,刚接触angular一个多月,开发过程中实时补充相关知识,有什么纰漏大神可以指出,希望共同进步.
原标题:angular $q服务
关键词: