Promise知識點總結(jié)

promise 是 es6 的特性,現(xiàn)代主流瀏覽器基本上都已經(jīng)支持,可以放心使用了。

promise 對象代表一個異步操作,具有3中狀態(tài):
1、pending :初始狀態(tài)。
2、resolve:操作成功的狀態(tài)。
3、reject:操作失敗的狀態(tài)。

創(chuàng)建 promise 對象后,會立即執(zhí)行,其狀態(tài)為 pending ;執(zhí)行之后只有2中結(jié)果:執(zhí)行成功會變成 resolve 狀態(tài),執(zhí)行失敗會執(zhí)行 reject 狀態(tài)。
promise 的狀態(tài)是無法獲取的,它是內(nèi)部變量。但可以在控制臺的輸出可以看見:


promise 對象在控制臺的輸出

而且該狀態(tài)也不需要獲取,因為promise一旦建立,就會執(zhí)行,而且該執(zhí)行過程是不可以取消的,所以執(zhí)行結(jié)果始終都會在promise.then()或者promise.catch()方法中出現(xiàn)。

promise 的優(yōu)缺點:
優(yōu)點:
1、將異步操作以同步操作的方式表達出來,避免層層嵌套回調(diào)函數(shù)
2、提供統(tǒng)一的操作接口,方便對異步操作的控制
缺點:
1、promise一旦建立,則不可取消
2、如果不設(shè)置回調(diào)函數(shù),則會在promise內(nèi)部拋出錯誤,不會反應(yīng)到外部
3、當狀態(tài)是pending是,無法判斷當前狀態(tài)(是異步剛剛開始執(zhí)行還是即將完成了異步操作)

promise 的用法:
創(chuàng)建一個 promise 對象

var myPromise = new Promise(function(resolve, reject){
    // 執(zhí)行異步操作邏輯
    // 異步操作成功了,則調(diào)用 resolve() 方法
    // 異步操作失敗了,則調(diào)用 reject() 方法
})

例子:

var myFirstPromise = new Promise(function(resolve, reject){
    //當異步代碼執(zhí)行成功時,我們才會調(diào)用resolve(...), 當異步代碼失敗時就會調(diào)用reject(...)
    //在本例中,我們使用setTimeout(...)來模擬異步代碼,實際編碼時可能是XHR請求或是HTML5的一些API方法.
    setTimeout(function(){
        resolve("成功!"); //代碼正常執(zhí)行!
    }, 250);
});
 
myFirstPromise.then(function(successMessage){
    //successMessage的值是上面調(diào)用resolve(...)方法傳入的值.
    //successMessage參數(shù)不一定非要是字符串類型,這里只是舉個例子
    document.write("Yay! " + successMessage);
});

promise 相關(guān)API:
1、promise.then(onFulfilled, onRejected) 或者 promise.then(onFulfilled).catch(onRejected) 這兩個寫法是等價的,都是執(zhí)行promise執(zhí)行成功和失敗的處理
2、promise.then、promise.catch、promise.finally 的鏈式操作
promise.prototype.then 方法返回的是一個新的 Promise 對象,因此可以采用鏈式寫法。
例子:

const myPromise =
  (new Promise(myExecutorFunc))
  .then(handleFulfilledA,handleRejectedA)
  .then(handleFulfilledB,handleRejectedB)
  .then(handleFulfilledC,handleRejectedC)
  .finally(finallyHandleFunc);

// 或者,這樣可能會更好...

const myPromise =
  (new Promise(myExecutorFunc))
  .then(handleFulfilledA)
  .then(handleFulfilledB)
  .then(handleFulfilledC)
  .catch(handleRejectedAny)
  .finally(finallyHandleFunc);

3、promise.all(iterable)
這個方法返回一個新的promise對象,該promise對象在iterable參數(shù)對象里所有的promise對象都成功的時候才會觸發(fā)成功,一旦有任何一個iterable里面的promise對象失敗則立即觸發(fā)該promise對象的失敗。
4、promise.allSettled(iterable)
等到所有promises都已敲定(settled)(每個promise都已兌現(xiàn)(fulfilled)或已拒絕(rejected))。
返回一個promise,該promise在所有promise完成后完成。并帶有一個對象數(shù)組,每個對象對應(yīng)每個promise的結(jié)果。
5、promise.any(iterable)
接收一個Promise對象的集合,當其中的一個 promise 成功,就返回那個成功的promise的值。
6、promise.race(iterable)
當iterable參數(shù)里的任意一個子promise被成功或失敗后,父promise馬上也會用子promise的成功返回值或失敗詳情作為參數(shù)調(diào)用父promise綁定的相應(yīng)句柄,并返回該promise對象。
7、promise.resolve(value)
返回一個狀態(tài)由給定value決定的Promise對象。
例如:

var p = Promise.resolve('Hello');
 
p.then(function (s){
  console.log(s)
});
// Hello

8、promise.reject(reason)
返回一個狀態(tài)為失敗的Promise對象,并將給定的失敗信息傳遞給對應(yīng)的處理方法
例子:

var p = Promise.reject('出錯了');
 
p.then(null, function (s){
  console.log(s)
});
// 出錯了
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容