es6—Promise

狸xun尋發表於2018-03-31

關於 Promise 的 9 個提示

八段程式碼徹底掌握 Promise

一 什麼是promise

es6—Promise

promise用途:非同步操作佇列化,比傳統的非同步操作回撥函式事件更合理更強大。(回撥函式:回撥函式就是一個引數,將這個函式作為引數傳到另一個函式裡面,當那個函式執行完之後,再執行傳進去的這個函式。這個過程就叫做回撥。主函式的事先幹完,回頭再呼叫傳進來的那個函式 )

es6—Promise

es6—Promise非同步回撥的問題:           

  • 巢狀層次深,難以維護
  • 無法正常使用return和catch throw
  • 多個回撥之間難以建立聯絡,一個回撥函式一旦開啟,就無法對其操作
  • 無法正常索引堆疊資訊


二 怎麼使用Promise

es6—Promise

1.初始化Promise例項     

2.傳入執行器executor函式,接收兩個引數resolve,reject

3.通過判斷資料處理完成或者失敗來呼叫resolve()或reject(),從而改變Promise狀態

4.Promise狀態發生改變就會觸發.then( )裡的響應函式的後續步驟,Promise狀態已經改變,就不會再變化了

es6—Promise

Promise的三個狀態:

pending:[待定]初始狀態

fulfilled:[實現]操作成功

rejected:[被否決]操作失敗


.then( )

.then( ) 接受兩個函式作為引數,分別代表fulfilled,rejected。

.then()返回一個新的Promise例項,所以可以鏈式呼叫。

狀態響應函式可以返回新的Promise,或者其他值,也可以不返回(undefined)。

.then()返回新的Promise,下一級.then()會在新的Promise狀態改變後根據其最終狀態,選擇特定的狀態響應函式執行執行。.then()裡不返回Promise例項或者其他值,則立刻執行下一級.then()。

錯誤處理

Promise會自動捕獲內部異常,並提交給rejected響應函式處理

es6—Promise

es6—Promise


三 例項

Promise作為佇列最重要的特性,在任何地方生成一個Promise物件,可以將Promise物件做為變數傳遞到其他地方

es6—Promise

then的巢狀  .then( )裡有.then( )的情況

要等裡面的.then()執行完,再執行外面的,可以把裡面的.then()展開


es6—Promise

es6—Promise

es6—Promisees6—Promise

四 Promise的屬性

Promise.all( )

Promise.all([p1,p2,p3,...])用於將多個promise例項,包裝成一個新的Promise例項,返回一個新的普通的Promise例項。

接受一個陣列作為引數。陣列裡可以是Promise物件,也可以是其他值,只有Promise會等待狀態改變。

當所有的子Promise都完成,該Promise完成,返回值是全部值的陣列。

子Promise有任何一個失敗,該Promise失敗,返回值為第一個失敗子Promise的結果。


Promise實現佇列:不希望所以事情一起發生,而是按照一定的順序

es6—Promise

es6—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.把非同步操作和定時器放在一起,如果定時器先觸發,就認為超時,告知使用者



相關文章