使用回調表達程序異步性和管理并發的兩個主要類別的不足:缺乏順序性和缺乏可靠性。
Promise正在像風暴一樣席卷JS世界,因為開發者和語言規范作者之流拼命地想要在他們的代碼/設計中結束回調地獄的瘋狂。
什么是Promise?
Promise是這樣一種工具:它能非常明顯地看出使用者是否理解了它是為什么和關于什么,還是僅僅學習和使用API。
1.未來的值
這個占位符號實質上使這個值與時間無關。它是一個未來的值。
換句話說,一旦我的未來的值準備好,我就用我的許諾值換回值本身。
明確地創建并返回了一個事件監聽能力,調用方代碼接收并在它上面注冊了兩個事件監聽器。
未來的值的一個重要性質:它們既可以表示成功也可以表示失敗。
2.現在和稍后的值
為了一致地處理現在和稍后,我們將它們都作為稍后:所有的操作都變成異步的。
3.Promise值
因為Promise包裝了時間相關的狀態——等待當前值的完成或拒絕——從外部看來,Promise本身是時間無關的,如此Promise就可以用可預測的方式組合,而不用關心時間或底層的結果。
另外,一旦Promise被解析,它就永遠保持那個狀態——它在那個時刻變成了一個不可變的值——而且可以根據需要被監聽任意多次。
注意:因為Promise一旦被解析就是外部不可變的,所以現在將這個值傳遞給任何其他團體都是安全的,而且我們知道它不會被意外或惡意地被修改。這在許多團體監聽同一個Promise的解析時特別有用。一個團體去影響另一個團體對Promise解析的監聽能力是不可能的。不可變性聽起來是一個學院派話題,但它實際上是Promise設計中最基礎且最重要的方面之一,因此不能將它隨意地跳過。
Promise是一種用來包裝與組合未來值,并且可以很容易復用的機制。
4.完成事件
作為一種流程控制機制——俗稱“這個然后那個”。
5.Promise“事件”
注意:我們監聽的Promise解析“事件”并不是嚴格的事件(雖然它們為了某些目的表現得像事件),而且它們也不經常稱為"completion"或"error"。相反,我們用then(..)來注冊一個"then"事件。或者也許更準確地講,then(..)注冊了"fulfillment(完成)"和/或"rejection(拒絕)"事件,雖然我們在代碼中不會看到這些名詞被明確地使用。
注意:在new Promise( function(..){ .. } )中展示的模式通常被稱為“揭示構造器(revealing constructor)”。被傳入的函數被立即執行(不會被異步推遲,像then(..)的回調那樣),而且它被提供了兩個參數,我們叫它們resolve和reject。這些是Promise的解析函數。resolve(..)一般表示完成,而reject(..)表示拒絕。