ES6關於Promise的用法

2021-09-02 05:38:47 字數 4063 閱讀 9821

含義

promise 物件用於乙個非同步操作的最終完成(或失敗)及其結果值的表示。簡單點說,它就是用於處理非同步操作的,非同步處理成功了就執行成功的操作,非同步處理失敗了就捕獲錯誤或者停止後續操作。

new promise(

/* executor */

function(resolve, reject) else

});

我們可以把promise物件看成是一條工廠的流水線,對於流水線來說,從它的工作職能上看,它只有三種狀態,乙個是初始狀態(剛開機的時候),乙個是加工產品成功,乙個是加工產品失敗(出現了某些故障)。同樣對於promise物件來說,它也有三種狀態:

pending

初始狀態,也稱為未定狀態,就是初始化promise時,呼叫executor執行器函式後的狀態。

fulfilled

完成狀態,意味著非同步操作成功。

rejected

失敗狀態,意味著非同步操作失敗。

它只有兩種狀態可以轉化,即

操作成功

pending -> fulfilled

操作失敗

pending -> rejected

並且這個狀態轉化是單向的,不可逆轉,已經確定的狀態(fulfilled/rejected)無法轉回初始狀態(pending)。

方法promise.prototype.then()

promise物件含有then方法,then()呼叫後返回乙個promise物件,意味著例項化後的promise物件可以進行鏈式呼叫,而且這個then()方法可以接收兩個函式,乙個是處理成功後的函式,乙個是處理錯誤結果的函式。

var promise1 = new promise(function(resolve, reject) , 2000);

});promise1.then(function(data) , function(err) ).then(function(data) ).then(function(data) );

返回的這個promise物件的狀態主要是根據promise1.then()方法返回的值,大致分為以下幾種情況:

如果then()方法中返回了乙個引數值,那麼返回的promise將會變成pulfilled狀態。

如果then()方法中丟擲了乙個異常,那麼返回的promise將會變成rejected狀態。

如果then()方法呼叫resolve()方法,那麼返回的promise將會變成pulfilled狀態。

如果then()方法呼叫reject()方法,那麼返回的promise將會變成rejected狀態。

如果then()方法返回了乙個未知狀態(pending)的promise新例項,那麼返回的新promise就是未知狀態。

如果then()方法沒有明確指定的resolve(data)/reject(data)/return data時,那麼返回的新promise就是rejected狀態,可以一層一層地往下傳遞。

轉換例項如下:

var promise2 = new promise(function(resolve, reject) , 2000);

});promise2.then(function(data) ) .then(function(data) );

}, function(err) ) .then(function(data) , function(err) ) .then(function(data) );

promise.prototype.catch()

catch()方法和then()方法一樣,都會返回乙個新的promise物件,它主要用於捕獲非同步操作時出現的異常。因此,我們通常省略then()方法的第二個引數,把錯誤處理控制權轉交給其後面的catch()函式,如下:

var promise3 = new promise(function(resolve, reject) , 2000);

});promise3.then(function(data) ).catch(function(err) );

promise.all()

promise.all()接收乙個引數,它必須是可以迭代的,比如陣列。

它通常用來處理一些併發的非同步操作,即它們的結果互不干擾,但是又需要非同步執行。它最終只有兩種狀態:成功或者失敗。

它的狀態受引數內各個值的狀態影響,即裡面狀態全部為fulfilled時,它才會變成fulfilled,否則變成rejected。

成功呼叫後返回乙個陣列,陣列的值是有序的,即按照傳入引數的陣列的值操作後返回的結果。如下:

`// 置為fulfilled狀態的情況

var arr = [1, 2, 3];

var promises = arr.map(function(e) );

});promise.all(promises).then(function(data) );

// 置為rejected狀態的情況

var arr = [1, 2, 3];

var promises2 = arr.map(function(e)

resolve(e * 5);

});});promise.all(promises2).then(function(data) ).catch(function(err) );`

promise.race()

promise.race()和promise.all()類似,都接收乙個可以迭代的引數,但是不同之處是promise.race()的狀態變化不是全部受引數內的狀態影響,一旦引數內有乙個值的狀態發生的改變,那麼該promise的狀態就是改變的狀態。就跟race單詞的字面意思一樣,誰跑的快誰贏。如下:

var p1 = new promise(function(resolve, reject) );

var p2 = new promise(function(resolve, reject) );

var p3 = new promise(function(resolve, reject) );

promise.race([p1, p2, p3]).then(function(data) ).catch(function(err) );

promise.resolve()

promise.resolve()接受乙個引數值,可以是普通的值,具有then()方法的物件和promise例項。正常情況下,它返回乙個promise物件,狀態為fulfilled。但是,當解析時發生錯誤時,返回的promise物件將會置為rejected態。如下:

// 引數為普通值

var p4 = promise.resolve(5);

p4.then(function(data) );

// 引數為含有then()方法的物件

var obj =

};var p5 = promise.resolve(obj);

p5.then(function(data) );

// 引數為promise例項

var p6 = promise.resolve(7);

var p7 = promise.resolve(p6);

p7.then(function(data) );

// 引數為promise例項,但引數是rejected態

var p8 = promise.reject(8);

var p9 = promise.resolve(p8);

p9.then(function(data) ).catch(function(err) );

promise.reject()

promise.reject()和promise.resolve()正好相反,它接收乙個引數值reason,即發生異常的原因。此時返回的promise物件將會置為rejected態。如下:

var p10 = promise.reject('手動拒絕');

p10.then(function(data) ).catch(function(err) ).then(function(data) );

ES6關於promise技巧

1.推向promise物件推向 不同的狀態 const pro newpromise resolve,reject 2.原型成員 例項成員 註冊乙個後續處理函式,當promise為resolved狀態是執行該函式,當promise為rejected狀態是執行該函式的第二個引數 catch 註冊乙個後...

ES6中的Promise的用法總結

第一部分 什麼是promise promise是es6中提供的乙個非同步程式設計的解決方案,promise本身是乙個建構函式 typeof promise function 一般情況下 我們在開發中會使用 new promise 呼叫建構函式,建立乙個新的promise物件,promise物件有兩個...

使用ES6模擬Promise

const promise newstatus param newvalue param queue 執行的作業佇列 changestatus newstatus,newvalue,queue this promisestatus newstatus this promivevalue newval...