當前位置:
首頁 > 最新 > Promise介面是AngularJS組織API的基礎

Promise介面是AngularJS組織API的基礎

已經看過了AngularJS是如何實現非同步和deferred這兩個API的。這裡面,Promise介面是AngularJS組織API的基礎。從根本上講,Promise介面從以下方面對非同步請求做出了規範:

步請求返回一個promise,而不是返回具體值。

Promise帶有一個then函數,這個函數有兩個參數:第一個參數是處理「resolved」和「success」事件的函數;第二個參數是處理「rejected」和「failure」事件的函數。調用這兩個函數時將會把結果或者拒絕的原因作為參數傳遞進去。

只要返回的結果是合法的,介面就可以保證這兩個函數中的一個會被調用。大多數deferred/Q實現都會遵守以上方式,但是AngularJS的實現比較特殊,原因如下: AngularJS知道$q的存在,所以$q會被整合到作用域模型中去。這樣可以使解析時的傳遞速度更快,並且可以減少UI的閃爍和刷新。AngularJS的模板也認識$q,這樣一來,介面的內容就可以被當作最終結果值(而不是當作promise)來對待,然後等獲取結果之後再通知promise。體積更小,因為對於常用的非同步任務來說,AngularJS只實現了它們所需要的最基本、最重要的功能。你可能會問為什麼要做這樣一件瘋狂的事情呢?我們來看看使用非同步函數時經常會遇到的一個問題:

在使用JavaScript時,人們經常會抱怨這種可怕的、金字塔一樣的代碼縮進噩夢。從本質上來說,非同步返回的方式和程序的同步處理之間存在衝突,從而導致了多重嵌套的函數,這樣就更難跟蹤到當前的上下文了。另外,對錯誤的處理也存在同樣的問題。處理錯誤的最佳方式是什麼?你會在每一個步驟中都處理錯誤嗎?那樣會把代碼搞得一團糟。為了解決這一問題,Promise方案提供了then的概念,在成功的情況下會執行一個函數,在出錯的情況下執行另一個函數,兩個函數都可以進行鏈式調用。所以,對於上面這個例子,如果使用Promise API(至少使用AngularJS的實現),可以這樣展開:

整個金字塔式的代碼就被很好地平坦化了,並且提供了鏈式的作用域,以及一個單一的出錯處理點。你可以在應用中使用同樣的代碼來處理非同步調用,只要導入AngularJS的$q服務即可。


喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 行家匯 的精彩文章:

TAG:行家匯 |