ES6 Promise(1) 基本概念
概念
ES6 原生提供了 Promise 對象。
Promise是異步編程的一種解決方案,它比傳統的解決方案——回調函數和事件——更合理和更強大。
Promise其實就是一個對象,用來傳遞異步操作的消息。它代表了某個未來才會知道結果的事件(通常是一個異步操作),并且這個事件提供統一的 API,可供進一步處理。
?Promise的幾種狀態(tài)
pending: 初始狀態(tài),既不是成功,也不是失敗狀態(tài)。
fulfilled: 意味著操作成功完成。
rejected: 意味著操作失敗。
Promise的狀態(tài)轉變圖

瀏覽器的兼容性

Promise 對象兩個特點
1)對象的狀態(tài)不受外界影響。Promise 對象代表一個異步操作,只有異步操作的結果,可以決定當前是哪一種狀態(tài),任何其他操作都無法改變這個狀態(tài)。這也是 Promise 這個名字的由來,它的英語意思就是「承諾」,表示其他手段無法改變。
2)一旦狀態(tài)改變,就不會再變,任何時候都可以得到這個結果。Promise 對象的狀態(tài)改變,只有兩種可能:從 Pending 變?yōu)?Resolved 和從 Pending 變?yōu)?Rejected。只要這兩種情況發(fā)生,狀態(tài)就凝固了,不會再變了,會一直保持這個結果。就算改變已經發(fā)生了,你再對 Promise 對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監(jiān)聽,是得不到結果的。
有了 Promise 對象,就可以將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數。此外,Promise 對象提供統一的接口,使得控制異步操作更加容易。
缺點
1)無法取消 Promise,一旦新建它就會立即執(zhí)行,無法中途取消。
2)如果不設置回調函數,Promise 內部拋出的錯誤,不會反應到外部。
3)當處于 Pending 狀態(tài)時,無法得知目前進展到哪一個階段。
語法
new Promise( function(resolve, reject) {...} /* executor */ ?);
executor是帶有?resolve
?和?reject
?兩個參數的函數?。Promise構造函數執(zhí)行時立即調用executor
?函數,?resolve
?和?reject
?兩個函數作為參數傳遞給executor
(executor 函數在Promise構造函數返回所建promise實例對象前被調用)。resolve
?和?reject
?函數被調用時,分別將promise的狀態(tài)改為fulfilled(完成)或rejected(失敗)。executor 內部通常會執(zhí)行一些異步操作,一旦異步操作執(zhí)行完畢(可能成功/失敗),要么調用resolve函數來將promise狀態(tài)改成fulfilled,要么調用reject
?函數將promise的狀態(tài)改為rejected。如果在executor函數中拋出一個錯誤,那么該promise 狀態(tài)為rejected。executor函數的返回值被忽略。
屬性
Promise.length
????length屬性,其值總是為?1 (構造器參數的數目).
Promise.prototype
????表示?Promise
?構造器的原型.
方法
Promise.all(iterable)
這個方法返回一個新的promise對象,該promise對象在iterable參數對象里所有的promise對象都成功的時候才會觸發(fā)成功,一旦有任何一個iterable里面的promise對象失敗則立即觸發(fā)該promise對象的失敗。
這個新的promise對象在觸發(fā)成功狀態(tài)以后,會把一個包含iterable里所有promise返回值的數組作為成功回調的返回值,順序跟iterable的順序保持一致;如果這個新的promise對象觸發(fā)了失敗狀態(tài),它會把iterable里第一個觸發(fā)失敗的promise對象的錯誤信息作為它的失敗錯誤信息。
Promise.all方法常被用于處理多個promise對象的狀態(tài)集合。
Promise.race(iterable)
當iterable參數里的任意一個子promise被成功或失敗后,父promise馬上也會用子promise的成功返回值或失敗詳情作為參數調用父promise綁定的相應句柄,并返回該promise對象。
Promise.reject(reason)
返回一個狀態(tài)為失敗的Promise對象,并將給定的失敗信息傳遞給對應的處理方法
Promise.resolve(value)
返回一個狀態(tài)由給定value決定的Promise對象。如果該值是thenable(即,帶有then方法的對象),返回的Promise對象的最終狀態(tài)由then方法執(zhí)行決定;否則的話(該value為空,基本類型或者不帶then方法的對象),返回的Promise對象狀態(tài)為fulfilled,并且將該value傳遞給對應的then方法。
通常而言,如果你不知道一個值是否是Promise對象,使用Promise.resolve(value) 來返回一個Promise對象,這樣就能將該value以Promise對象形式使用。
Promise 原型
01屬性
Promise.prototype.constructor
返回被創(chuàng)建的實例函數.? 默認為 Promise 函數.
方法
Promise.prototype.catch(onRejected)
添加一個拒絕(rejection) 回調到當前 promise, 返回一個新的promise。當這個回調函數被調用,新 promise 將以它的返回值來resolve,否則如果當前promise 進入fulfilled狀態(tài),則以當前promise的完成結果作為新promise的完成結果.
Promise.prototype.then(onFulfilled, onRejected)
添加解決(fulfillment)和拒絕(rejection)回調到當前 promise, 返回一個新的 promise, 將以回調的返回值來resolve.
Promise.prototype.finally(onFinally)
添加一個事件處理回調于當前promise對象,并且在原promise對象解析完畢后,返回一個新的promise對象?;卣{會在當前promise運行完畢后被調用,無論當前promise的狀態(tài)是完成(fulfilled)還是失敗(rejected)