1. 程式人生 > >Promise的隨筆學習筆記與理解

Promise的隨筆學習筆記與理解

我們 學習一個新的特性時,我習慣先了解他是什麼, 有什麼用

在 w3c中 可知 Promise 是 抽象非同步處理物件以及對其進行各種操作的元件 . 他 多用於 處理回撥地獄 . 什麼是回撥地獄呢? 即 巢狀多個回撥 如果 有多個回撥互相巢狀 則 會難以除錯與 理解 增大程式碼維護的難度與可讀性

使用 promise 就能解決這個問題 , promise 可以是一個佔位符,表示非同步操作的執行結果, 函式可以返回一個promise 而不 是 傳遞一個回撥

promise 都會有一個 短暫的生命週期

有兩種狀態

初始的掛起未決狀態 --> 非同步未結束

已決的狀態 ---> 非同步操作結束

處於 已決轉態 會有兩種情況

1  已經成功完成的非同步操作

2 可能是一個錯誤或者其他的原因導致了 非同步的操作沒成功

此時 promise中有個 [ [PromiseState]] 屬性 會被設定 為 pending fulfilled 或者 rejected , 以反映 promise 的狀態處於 哪一步 . 但這個屬性 並不在 promise 物件上面 暴露. 因此 無法 判斷 他處於那種狀態

但此時其 提供了

then() 方法 

他在所有的promise 上都存在. 並且接受兩個引數  .

  	第一個 引數 是promise 被完成時 呼叫的 函式  , 非同步操作的結果資料  
  		都會傳入 完成函式

  	第二個函式 則是 promise 被拒絕的時呼叫的函式, 也會將失敗的引數資料   

	這兩個引數是可選的  可以自由的監聽 完成 和失敗的處理函式

catch 方法 

Promise有catch()方法,等同於只傳遞拒絕處理函式給then()方法:

用處 比如 Vue 發起axios 的請求時 正常來說非同步 返回的是 一個 回撥函式. 但此時 使用 promise 直接返回一個 axios.get或者 axios.post 讓這個 promise 物件 (axios是promise物件 )自己 進行 成功 ( .then() ) 之後的 處理 或者失敗(.catch() ) 的提示

他人總結: Promise 具有三種狀態:掛起、已完成、已拒絕。一個 Promise 起始於掛起態,並在成功時轉為完成態,或在失敗時轉為拒絕態。 then() 方法允許你繫結完成處理函式與拒絕處理函式,而 catch() 方法則只允許你繫結拒絕處理函式;

能夠將多個Promise串聯起來組成Promise鏈,並且能夠在中間傳遞值,甚至是傳遞Promise物件。 then() 的呼叫都建立並返回了一個新的 Promise ,只有在前一個 Promise 被決議過,新 Promise 也會被決議。 同時也可以使用Promise.all()和Promise.race()方法來管理多個Promise