angular中的 q服務例項

2022-01-16 19:45:34 字數 2026 閱讀 9852

用於理解$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