天天看點

ES6-----Promise 對象

Promise實際上不是什麼新鮮的東西,他是異步程式設計的一種解決方案,相較于傳統的回調函數和事件來說更靈活和更節約時間,在ES6中他得到了規範化

在ES6中,Promise往小了說是一個容器,儲存着不知道什麼時候會結束的事件的結果。他是一個對象,可以取得異步操作的消息

他有兩個特點:

  1. 對象的狀态不受外界影響。他代表一個異步操作,隻有三種狀态,pending(進行中)、fulfilled(已成功)和失敗(reject),從外界無法改變其狀态
  2. 一旦狀态改變,就不會再改變,任何時候都會獲得這個結果,是以他的結果隻有兩種,要麼成功要麼失敗,狀态會一直凝結,等待來取他的那個人

他有三個缺點:

  1. 無法取消Promise,一旦建立就會立即執行,不能取消
  2. 必須要有回調函數,不然會内部報錯
  3. 當處于pending狀态時,無法判斷此時的結果狀态

基本用法

Promise是一個構造函數,用來生成Promise執行個體。其參數是resolve(成功時的結果)和reject(失敗時的錯誤),這是有JS引擎提供的。

const promise = new Promise(function(resolve, reject) {
  // ... some code

  if (/* 異步操作成功 */){
    resolve(value);
  } else {
    reject(error);
  }
});
           

執行個體生成後,使用then方法,分别指定兩種狀态的處理結果的回調函數

promise.then(function(value) {
  // success
}, function(error) {
  // failure
});
           

方法

then()

then方法是定義再原型Promise.prototype上的,其作用是狀态改變時的回調函數。在實際應用中,可以采用鍊式的then調用多個Promise對象

catch()

catch方法也是定義再原型Promise.prototype,其作用是用于指定發生錯誤時的回調函數,用于捕獲錯誤

finally()

finally方法也是定義再原型Promise.prototype,他的作用是不管最後的狀态如何,都會執行的操作,該方法在ES2018中引入,這個方法沒有任何參數,其本質是then()的特例

all()

用于多個Promise執行個體,包裝成一個新的Promise執行個體

race()

将多個 Promise 執行個體,包裝成一個新的 Promise 執行個體。

resolve()

将對象轉為Promise對象,

reject()

傳回一個新的Promise執行個體,該執行個體的狀态是rejected