使用promise
我們先可以了解一下$q的defer()方法創(chuàng)建的對象具有哪些方法
resolve(value):用來執(zhí)行deferred promise,value可以為字符串茬底,對象等瞭吃。
reject(value):用來拒絕deferred promise舔哪,value可以為字符串酒繁,對象等皮钠。
notify(value):獲取deferred promise的執(zhí)行狀態(tài)识樱,然后使用這個函數(shù)來傳遞它艳汽。
then(successFunc, errorFunc, notifyFunc):無論promise是成功了還是失敗了猴贰,當(dāng)結(jié)果可用之后,then都會立刻異步調(diào)用successFunc河狐,或者'errorFunc'米绕,在promise被執(zhí)行或者拒絕之前,notifyFunc可能會被調(diào)用0到多次甚牲,以提供過程狀態(tài)的提示义郑。
catch(errorFunc):拋出異常的時候,觸發(fā)該函數(shù).可以為整個then鏈提供一個統(tǒng)一異常處理.
finally(callback):總是會被執(zhí)行,不管 promise 被處理或者被拒絕丈钙,起清理作用?
1. 引用angular.js后,定義控制器,配置$q環(huán)境
<script?src="Scripts/jquery-1.9.1.js"></script>
<script>
????angular.module('myApp', []).controller('helloCtrl', ['$scope', '$q', '$timeout', function (scope, q, timeout) {
????}
</script>
2. 定義一個func函數(shù).
function?func() {
????var?defer = $q.defer();//創(chuàng)建1個defer對象
????var?promise = defer.promise;//獲取promise對象
????promise.then(function?(e) {
????????console.log('then1-success'?+ e);
????},?function?(e) {
????????console.log('then1-faild'?+ e);
????},?function?(e) {
????????console.log('then1-notice'?+ e);
????}).then(function?(e) {
????????console.log('then2-success'?+ e);
????????throw?"then2 exception";
????}).catch(function?(e) {
????????console.log('catch'?+ e);
????}).finally(function?(e) {
????????console.log('finally'?+ e);
????});
????defer.notify('通知1');
????defer.notify('通知2');
????defer.resolve('成功1');
????defer.reject('失敗1');
}
3. 觸發(fā)func函數(shù)(綁定到scope上即可觸發(fā))
補充說明
在執(zhí)行promise的resolve和reject方法時,表示異步結(jié)束.(所以此處沒顯示'失敗1')
then2中,e為undefined.原因是上個then方法中并沒有return對象.(同樣只能在successFunc, errorFunc中返回才有效)
如果上個then方法返回一個promise對象,則then2會在promise異步結(jié)束時才觸發(fā),并獲取到異步結(jié)果.
為了更好的說明,這里演示一下then返回promise的情況.
function?funcPromise() {
????var?defer = q.defer();
????var?promise = defer.promise;
????promise.then(function() {
????????var?thenDefer = q.defer();
????????timeout(function() {
????????????thenDefer.resolve('thenDefer 成功');
????????????//thenDefer.reject('thenDefer 失敗');//會觸發(fā)下個then的errorFunc
????????});
????????return?thenDefer.promise;
????}).then(function(e) {
????????console.log('then2-success'?+ e);
????},function(e) {
????????console.log('then2-faild'?+ e);
????});
????defer.resolve();
}
$q.all()非驮,允許你等待并行的 promise 處理,當(dāng)所有的 promise 都被處理結(jié)束之后雏赦,調(diào)用共同的回調(diào)
scope.all =?function?() {
????q.all([getAjaxPromise(), getTimePromise()]).then(function?() {
????????console.log(arguments);
????});
}
getAjaxPromise 和?getTimePromise 函數(shù)都返回promise對象了
$q.when(),可以將非promise標(biāo)準(zhǔn)的對象 提供給then函數(shù).
scope.when =?function() {
????q.when('hello').then(function(e) {
????????console.log(e);
????});
????q.when(getAjaxPromise()).then(function?(e) {
????????console.log(e);
????});
}
getAjaxPromise 是返回promise標(biāo)準(zhǔn)的 而'hello'是一個普通的字符