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