$http. get('/remote/item' ). then(function(response) {
console.log('成功。');
}, function(errResponse) {
console. error('出錯(cuò).' );
});
一。介紹Promise
在這個(gè)例子中,$http.get()函數(shù)返回了一個(gè)Promise對(duì)象, 有了這個(gè)對(duì)象,我們才能很方便地直接在后面添加then函數(shù)的定義。
Promise對(duì)象在AngularJS中是一個(gè)非常重要的存在。它提供了強(qiáng)大的功能和便利性。
1。異步性
從定義的語(yǔ)法上看,操作似乎是同步的,但是Promise的工作其實(shí)是異步的,只有在服務(wù)端返回?cái)?shù)據(jù)后,后續(xù)的函數(shù)才會(huì)被調(diào)用。這是一個(gè)事件驅(qū)動(dòng),非阻塞式的框架。
2。它避免了其它框架的嵌套回調(diào)函數(shù)的缺點(diǎn)。
-所有異步任務(wù)都會(huì)返回一個(gè)Promise對(duì)象
-每個(gè)Promise對(duì)象都有一個(gè)then函數(shù),then函數(shù)有兩個(gè)參數(shù),分別是成功處理函數(shù)和失敗處理函數(shù)
-失敗處理函數(shù)和成功處理函數(shù)都只會(huì)在異步處理完成后被調(diào)用一次
-then函數(shù)也會(huì)返回Promise對(duì)象,這樣,我們可以把多個(gè)函數(shù)串連起來(lái)成為一個(gè)函數(shù)鏈
-成功處理函數(shù)和失敗處理函數(shù)的返回值可以被傳遞到函數(shù)鏈下一個(gè)的函數(shù)中
-如果在成功(或者失敗)處理函數(shù)中,又開(kāi)始了一個(gè)異步調(diào)用,那么函數(shù)鏈中的函數(shù)將會(huì)在這個(gè)異步調(diào)用結(jié)束后才開(kāi)始
二。異步鏈?zhǔn)秸{(diào)用的后續(xù)處理
假如我們定義了如下的函數(shù)鏈:
$http.get('/item').then(s1, e1).then(s2, e2).then(s3, e3);
我們?nèi)绾巫灾鞯母鶕?jù)函數(shù)鏈中每個(gè)函數(shù)的運(yùn)行結(jié)果,決定觸發(fā)后續(xù)函數(shù)的成功處理函數(shù)或者失敗處理函數(shù)呢?
比如說(shuō),在s1處理過(guò)程中,發(fā)生問(wèn)題,于是我們觸發(fā)了e2, 但是在e2處理完后,我們又想觸發(fā)s3.
AnguarJS提供了$q來(lái)滿足這樣的需求。
如果我們想觸發(fā)函數(shù)鏈中下一個(gè)函數(shù)的成功處理,我們只需要最后給出一個(gè)返回值,有了返回值,AngularJS會(huì)認(rèn)為函數(shù)執(zhí)行正確,自動(dòng)調(diào)用下一個(gè)函數(shù)中的成功處理
如果想觸發(fā)失敗處理,那么可以簡(jiǎn)單地返回$q.reject(data),這樣就會(huì)觸發(fā)下一個(gè)函數(shù)的失敗處理
posted @ 2015-02-27 18:39 云自無(wú)心水自閑 閱讀(2628) | 評(píng)論 (1) | 編輯 收藏