背景:在一個方法中處理一個複雜的異步操做時會涉及到多個異步處理,它們多是層層嵌套致使這個方法異常的龐大,影響往後的代碼維護和問題的查找promise
解決:在ES6中提供了一個Promise的對象,它以一種鏈式的寫法將異步操做邏輯與異步返回結果的處理邏輯分離,讓代碼更加有可讀性異步
原理:promise提供了三種狀態,經過狀態與then函數中指定的處理函數關聯,當promise處於fullfilled狀態的時候就會調用對應處理成功的函數,處於rejected狀態的時候就會調用then提供的失敗的處理函數函數
相關知識spa
語法:new Promise( function(resolve, reject) {...} /* executor */ );
prototype
Promise中提供了一個暫時稱爲executor的匿名回調函數,在建立Promise對象的時候會當即調用這個回調方法並傳遞兩個由Promise提供的接口函數resolve和reject。那麼何時去調用這兩個函數呢? 從語義上來理解來講resolve表示異步操做成功時的處理而reject表示異步操做失敗時的處理。在這個匿名函數中咱們只須要編寫異步執行的代碼邏輯而具體的異步返回的處理放到別處,這時候resolve和reject更像是兩個佔位符,調用他們分別在執行成功的地方用resolve佔一個位置,在失敗的地方用reject佔一個位置,promise會根據各自的狀態執行各自所關聯的結果處理函數
狀態:code
pending: 初始狀態,既不是成功,也不是失敗狀態。 fulfilled: 意味着操做成功完成。 rejected: 意味着操做失敗。
當調用resolve方法的時候會設置一個fulfilled狀態,調用rejected方法的時候會設置一個rejected狀態。只要promise處於這兩種狀態的一種它就會調用經過then方法添加相應處理函數,若是是pending狀態你須要先設置另外兩種中的一種纔會調用對應then方法中的處理函數
鏈式:圖中所示的方法都會建立一個新的promise對象以達到鏈式調用的目的對象
原型方法blog
then方法:Promise.prototype.then(onFulfilled, onRejected)
接口
這個then方法頗有意思,它提供上面所說的異步返回結果的處理邏輯,它會將處理邏輯與promise對象的狀態關聯。從上面看有兩個on前綴的變量,它們能夠是函數也能夠是字符串。若是是字符串它會將上個鏈傳遞的狀態和值傳遞到下一個鏈;若是onFulfilled/onRejected)是函數,那麼函數返回值能夠是一個本身建立的promise對象也能夠是一個字符串還能夠是沒有返回值,then方法會對這些返回值作解析並返回一個新的promise(返回字符串和什麼都不返回的狀況,then新建的promise對象的狀態是fulfilled。返回是自定義的promise,狀態由本身設但不能不給狀態,否則不會執行下一個鏈)
詳細文檔
Promise文檔圖片