一 什麼是promise
promise用途:非同步操作佇列化,比傳統的非同步操作回撥函式和事件更合理更強大。(回撥函式:回撥函式就是一個引數,將這個函式作為引數傳到另一個函式裡面,當那個函式執行完之後,再執行傳進去的這個函式。這個過程就叫做回撥。主函式的事先幹完,回頭再呼叫傳進來的那個函式 )
非同步回撥的問題:
- 巢狀層次深,難以維護
- 無法正常使用return和catch throw
- 多個回撥之間難以建立聯絡,一個回撥函式一旦開啟,就無法對其操作
- 無法正常索引堆疊資訊
二 怎麼使用Promise
1.初始化Promise例項
2.傳入執行器executor函式,接收兩個引數resolve,reject
3.通過判斷資料處理完成或者失敗來呼叫resolve()或reject(),從而改變Promise狀態
4.Promise狀態發生改變就會觸發.then( )裡的響應函式的後續步驟,Promise狀態已經改變,就不會再變化了
Promise的三個狀態:
pending:[待定]初始狀態
fulfilled:[實現]操作成功
rejected:[被否決]操作失敗
.then( )
.then( ) 接受兩個函式作為引數,分別代表fulfilled,rejected。
.then()返回一個新的Promise例項,所以可以鏈式呼叫。
狀態響應函式可以返回新的Promise,或者其他值,也可以不返回(undefined)。
.then()返回新的Promise,下一級.then()會在新的Promise狀態改變後根據其最終狀態,選擇特定的狀態響應函式執行執行。.then()裡不返回Promise例項或者其他值,則立刻執行下一級.then()。
錯誤處理
Promise會自動捕獲內部異常,並提交給rejected響應函式處理
三 例項
Promise作為佇列最重要的特性,在任何地方生成一個Promise物件,可以將Promise物件做為變數傳遞到其他地方
then的巢狀 .then( )裡有.then( )的情況
要等裡面的.then()執行完,再執行外面的,可以把裡面的.then()展開
四 Promise的屬性
Promise.all( )
Promise.all([p1,p2,p3,...])用於將多個promise例項,包裝成一個新的Promise例項,返回一個新的普通的Promise例項。
接受一個陣列作為引數。陣列裡可以是Promise物件,也可以是其他值,只有Promise會等待狀態改變。
當所有的子Promise都完成,該Promise完成,返回值是全部值的陣列。
子Promise有任何一個失敗,該Promise失敗,返回值為第一個失敗子Promise的結果。
Promise實現佇列:不希望所以事情一起發生,而是按照一定的順序
Promise.resolve( )
返回一個fulfilled的Promise例項,或者原始Promise例項。
引數為空,返回一個引數為fulfilled的例項;
引數是一個跟Promise無關的值,同上,不過,fulfilled響應函式會得到這個引數;
引數為Promise例項,則返回該例項,不做任何修改;
引數如果是thenable,則立即執行它的.then()函式;
Promise.reject( )
返回一個rejected的Promise例項。
Promise.reject( )不認theable。
Promise.race( )
類似於Promise.all( ),區別是Promise.race()有任意一個完成就算完成。
常用用法:
1.把非同步操作和定時器放在一起,如果定時器先觸發,就認為超時,告知使用者