用於理解$q服務
參考:和其它框架一樣, ng 提供了廣義的非同步**管理的機制。 $http 服務是在其之上封裝出來的。這個機制就是 ng 的 $q 服務。
不過 ng 的這套機制總的來說實現得比較簡單,按官方的說法,夠用了。
使用的方法,基本上是:
var testctrl = function($q),function(data));
'xx');
defer.resolve('xx');
}
瞭解了上面的東西,再分別看 $q , deferred , promise 這三個東西。
$q 有四個方法:
$q.all() 方法適用於併發場景很合適:
var testctrl = function($q, $http)});var p2 = $http.get('/json', });
var all = $q.all([p, p2]);
p.success(function(res));
all.then(function(res));
}
$q.reject() 方法是在你捕捉異常之後,又要把這個異常在**鏈中傳下去時使用:
要理解這東西,先看看 promise 的鏈式**是如何運作的,看下面兩段**的區別:
var defer = $q.defer();var p = defer.promise;
p.then(
function(data)
);p.then(
function(data)
);defer.resolve('123');
var defer = $q.defer();var p = defer.promise;
var p2 = p.then(
function(data)
);p2.then(
function(data)
);defer.resolve('123');
從模型上看,前者是“併發”,後者才是“鏈式”。
而 $q.reject() 的作用就是觸發後鏈的 error **:
var defer = $q.defer();var p = defer.promise;
p.then(
function(data),
function(data)
).then(
function(data),
function(data)
)defer.reject('123');
最後的 $q.when() 是把資料封裝成 promise 物件:
var p = $q.when(0, function(data),function(data));
p.then(
function(data),
function(data)
);
deferred 物件有兩個方法一個屬性。
var defer = $q.defer();var promise = defer.promise;
promise.then(function(data),
function(data));
'xx');
defer.resolve('xx');
promise 物件只有 then() 一個方法,註冊成功**函式和失敗**函式,再返回一個promise 物件,以用於鏈式呼叫。
下面是自己寫的例子
($scope, $http ,$q))
.error(
function
(data))
return
deferred.promise;
}//觸發premise的success
demo().then(function
(data))
}])demo