Posted on 2015-02-27 18:39
云自無心水自閑 閱讀(2616)
評論(1) 編輯 收藏 所屬分類:
AngularJS
先給一個例子:
$http. get('/remote/item' ). then(function(response) {
console.log('成功。');
}, function(errResponse) {
console. error('出錯.' );
});
一。介紹Promise
在這個例子中,$http.get()函數返回了一個Promise對象, 有了這個對象,我們才能很方便地直接在后面添加then函數的定義。
Promise對象在AngularJS中是一個非常重要的存在。它提供了強大的功能和便利性。
1。異步性
從定義的語法上看,操作似乎是同步的,但是Promise的工作其實是異步的,只有在服務端返回數據后,后續的函數才會被調用。這是一個事件驅動,非阻塞式的框架。
2。它避免了其它框架的嵌套回調函數的缺點。
-所有異步任務都會返回一個Promise對象
-每個Promise對象都有一個then函數,then函數有兩個參數,分別是成功處理函數和失敗處理函數
-失敗處理函數和成功處理函數都只會在異步處理完成后被調用一次
-then函數也會返回Promise對象,這樣,我們可以把多個函數串連起來成為一個函數鏈
-成功處理函數和失敗處理函數的返回值可以被傳遞到函數鏈下一個的函數中
-如果在成功(或者失敗)處理函數中,又開始了一個異步調用,那么函數鏈中的函數將會在這個異步調用結束后才開始
二。異步鏈式調用的后續處理
假如我們定義了如下的函數鏈:
$http.get('/item').then(s1, e1).then(s2, e2).then(s3, e3);
我們如何自主的根據函數鏈中每個函數的運行結果,決定觸發后續函數的成功處理函數或者失敗處理函數呢?
比如說,在s1處理過程中,發生問題,于是我們觸發了e2, 但是在e2處理完后,我們又想觸發s3.
AnguarJS提供了$q來滿足這樣的需求。
如果我們想觸發函數鏈中下一個函數的成功處理,我們只需要最后給出一個返回值,有了返回值,AngularJS會認為函數執行正確,自動調用下一個函數中的成功處理
如果想觸發失敗處理,那么可以簡單地返回$q.reject(data),這樣就會觸發下一個函數的失敗處理