Promise教學 - Promises/A+標準定義
本內容是從免費電子書從Promise開始的JavaScript異步生活中轉貼過來,有興趣可以前往閱讀。
原生的ES6 Promise是符合Promises/A+標準的
所謂的Promises/A+標準,其實就是個幾千字的一頁網頁而已,裡面的說明與用語並不會太難理解。雖然ES6標準中也有自己的Promise物件標準章節,但因為裡面涉及很多實作技術說明,明顯地用字遣詞艱澀許多,所以在這裡就不多加討論。以下使用Promises/A+標準作為一個開始,來解說Promise的標準裡有什麼內容。這一章僅有定義部份,之後的解說也是會依照Promises/A+標準中的規則來說明。
專門用語
promise
(承諾)是一個帶有遵照這個規格的then方法的物件thenable
是一個有定義then方法的物件value
合法的JavaScript值(包含undefined、thenable與promise)exception
(例外)使用throw語句丟出來的值reason
(理由)是表明為什麼promise被拒絕(rejected)的值
註: 另外有個常見的專有名詞
settled
(固定的) 一個promise最後的狀態,也就是fulfilled(已實現)或rejected(已拒絕)註:
reason
(理由)通常是一個Error物件,用於錯誤處理。註:
promise
/帕咪死/ 的中文翻譯是"承諾"、"約定",本書中並不會用它的中文翻譯字詞,都是直接用英文。
Promise狀態
promise物件必定是以下三種狀態中的其中一種: pending(等待中)、fulfilled(已實現)或rejected(已拒絕)。
2.1.1 當處在pending(等待中)時,一個promise:
2.1.1.1 可能會轉變到不是fulfilled(已實現)就是rejected(已拒絕)狀態
2.2.1 當處在fulfilled(已實現)時,一個promise:
2.2.1.1 必定不會再轉變到其他任何狀態
2.2.1.2 必定有不能再更動的值
2.3.1 當處在rejected(已拒絕)時,一個promise:
2.3.1.1 必定不會再轉變到其他任何狀態
2.3.1.2 必定有不能再更動的值reason(理由)
這個用下面的圖解說明,應該可以很清楚的理解:
狀態是在Promise結構很重要的一個屬性,因為promise物件一開始都是代表懸而未決的值,所以一開始在promise物件在建立時,狀態都是pending(等待中),之後可以轉變到fulfilled(已實現)就是rejected(已拒絕)其中一個,然後就固定不變了。如果有產生value(值)的情況就是轉變到fulfilled(已實現)狀態,而如果是有reason(理由)時,代表要轉變到rejected(已拒絕)狀態。
不過,講是這樣講,在實作時promise物件一旦實體化完成回傳出來,就已經決定好是那一種狀態了,要不就是fulfilled(已實現),要不就是rejected(已拒絕)。只是在實體化過程中,這個還不存在的(還沒回傳出來的)的promise物件的確是pending(等待中)狀態。看到後面的章節內容你大概能體會,其實這是一種保護措施,它的設計就是這樣子。