CommonJs的Promise規(guī)范有許多種,我們一般討論的是Promise/A+規(guī)范,它定義了Promise的基本行為。
Promise是一個對象,它通常代表一個在未來可能完成的異步操作。這個操作可能成功也可能失敗,所以一個Promise對象一般有3個狀態(tài):Pending,F(xiàn)ulfilled,Rejected。分別代表未完成、成功完成和操作失敗。一旦Promise對象的狀態(tài)從Pending變成Fulfilled或者Rejected任意一個,它的狀態(tài)都沒有辦法再被改變。
一個Promise對象通常會有一個then方法,這個方法讓我們可以去操作未來可能成功后返回的值或者是失敗的原因。這個then方法是這樣子的:
promise.then(onFulfilled, onRejected)
顯而易見的是,then方法接受兩個參數(shù),它們通常是兩個函數(shù),一個是用來處理操作成功后的結果的,另一個是用來處理操作失敗后的原因的,這兩個函數(shù)的第一個參數(shù)分別是成功后的結果和失敗的原因。如果傳給then方法的不是一個函數(shù),那么這個參數(shù)會被忽略。
then方法的返回值是一個Promise對象,這一個特點允許我們鏈式調用then來達到控制流程的效果。這里有許多細節(jié)上的問題,比如值的傳遞或者錯誤處理等。Promise的規(guī)范是這樣定義的:
onFulfilled或者onRejected函數(shù)的返回值不是Promise對象,則該值將會作為下一個then方法中onFulfilled的第一個參數(shù),如果返回值是一個Promise對象,怎么then方法的返回值就是該Promise對象
onFulfilled或者onRejected函數(shù)中如果有異常拋出,則該then方法的返回的Promise對象狀態(tài)轉為Rejected,如果該Promise對象調用then,則Error對象會作為onRejected函數(shù)的第一個參數(shù)
如果Promise狀態(tài)變?yōu)镕ulfilled而在then方法中沒有提供onFulfilled函數(shù),則then方法返回的Promise對象狀態(tài)變?yōu)镕ulfilled且成功的結果為上一個Promise的結果,Rejected同理。
補充一句,onFulfilled和onRejected都是異步執(zhí)行的。