CommonJS Promise标准
Promise分为两个部分
-
Deferred
-
Promise
Deferred用于作为通信对象,分为三个状态:开始,处理和结束.
Promise是Deferred响应数据的输出,同样拥有等待,执行和拒绝以及相应的回调函数.
$q
angular中能够帮你异步运行function的一项服务,当它们的处理线程完毕后,可以使用它们的返回值.
最新的ES6 style promise 本质上就是使用$q作为一个构造器(resolve function做为第一个参数).
-
$q.defer()
-
$q.when() ----用于通过一个变量创建一个promise
-
$q.all()
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 ----用于接收deferred的工作状态通知.并通过调用处理函数对状态处理.
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一个多月,开发过程中实时补充相关知识,有什么纰漏大神可以指出,希望共同进步.