更新時間:2025-08-22 17:50:19作者:佚名
什么是promise?
承諾,在代碼里的含義是保證在一段時間之后(一般涉及異步處理)會反饋一個結果,是異步處理的一種方法。從語言規(guī)則角度講,原生承諾是一個物件,能從中得知異步工作的進展情況。
promise的特點
承諾存在三種情形,分別是待定,成功和失敗,只有非同步執(zhí)行的結果,才能判定當前屬于哪一種情形,其他任何行為都無法更改這種情形。
promise只有兩種狀態(tài)改變:
處理中狀態(tài)轉為完成狀態(tài),
處理中狀態(tài),轉變?yōu)楸痪芙^結局。
狀態(tài)變更完成時稱作解決,一旦狀態(tài)變成了解決,就不能再次轉變?yōu)閷崿F(xiàn)。
promise實例操作
首先創(chuàng)造了一個Promise實例
創(chuàng)建一個承諾,這個承諾接受一個函數(shù)作為參數(shù),該函數(shù)有兩個參數(shù),一個是解決,一個是拒絕,
if(/*異步執(zhí)行成功*/){

resolve(value);
}else{
reject(error);
}
})
promise.then(function(){
//回調執(zhí)行成功之后的操作
},function(){
//回調執(zhí)行失敗之后的操作,可選
});
Promise的創(chuàng)建方法需要傳入一個處理函數(shù),此函數(shù)包含兩個參數(shù),一個是兌現(xiàn)的回調,另一個是拒絕的回調,這兩個回調函數(shù)均由JavaScript環(huán)境負責實現(xiàn)。異步任務順利完成時,就調用resolve方法,并將執(zhí)行結果作為參數(shù)傳遞進去,若異步任務執(zhí)行失敗,則調用reject方法,并將出現(xiàn)的異常作為參數(shù)返回。一旦Promise對象創(chuàng)建完畢,就可通過then函數(shù)來分別設定成功情形與失敗情形下的處理操作。
接下來探討一下如何定義函數(shù)原型方法Promise的then方法Promise的catch方法
上述代碼也可以理解成這樣:
獲取到位于路徑/posts.json的JSON數(shù)據(jù)后,接著執(zhí)行一個操作,這個操作以傳入的名為posts的參數(shù)作為處理對象,在處理過程中需要實現(xiàn)一個功能,這個功能會處理傳入的數(shù)據(jù),并且在完成后進行下一步的步驟
// ...
}).catch(function(error) {
處理 getJSON 過程中的異常,處理上一個回調函數(shù)執(zhí)行時的故障
console.log('發(fā)生錯誤!', error);
});
承諾對象里的最終方法能夠實現(xiàn)連續(xù)操作,它調用了承諾本身的接口,而承諾解析方法可以返回一個已解決狀態(tài)的承諾
把當前實體改造成承諾形態(tài),涉及四種數(shù)據(jù)規(guī)格:
Promise.reject()Promise.all()
這種技術把好幾個承諾實例,重新封裝成一個承諾實例。
將多個承諾組合成一個新承諾,這個新承諾在所有原始承諾都成功時才成功,在任何一個原始承諾失敗時立即失敗
參數(shù)未必是數(shù)組,也可能是其他可迭代對象,但必須具備可迭代特性,且其中包含的每個元素(p1、p2、p3)都應是 Promise 對象,若不是,則會先通過 Promise.resolve 方法將其轉換為 Promise 對象promise是什么意思,然后再進行后續(xù)操作。
var p = Promise.all([1,2,3]);
那個名為p2的變量,等于調用Promise.all函數(shù),參數(shù)是一個數(shù)組,里面包含數(shù)字1,數(shù)字2,數(shù)字3,以及一個已經解決為444的Promise對象
創(chuàng)建一個名為p3的Promise對象,該對象將等待一個包含數(shù)字1,2,3以及一個拒絕狀態(tài)的Promise的完成,當所有這些Promise都完成后,p3才會被解決或拒絕,其中拒絕狀態(tài)的值為555
setTimeout(function() {
console.log(p);// Promise { : "fulfilled", : Array[3] }
console.log(p2); // Promise { : "fulfilled", : Array[4] }
console.log(p3); // Promise { : "rejected", : 555 }
});
p.then(function (posts) {
// ..當有返回值的時候才會回調

}).catch(function(reason){
// ...
});
Promise.allSettled -- 兼容性不友好
這種做法和all任務類似,是為了糾正all任務在處理異常時的欠妥之處而設計的。它接收一組承諾作為輸入,然后生成一個承諾作為輸出,與all任務的主要區(qū)別在于,它不會發(fā)生中斷,即無論承諾是否成功,在所有承諾處理完畢后,我們都能獲取到每個承諾的狀態(tài)。
Promise.race()
這種技術同樣是將好幾個承諾對象,整合為一個新的承諾對象,其余方面與all相似,但與all的不同之處在于:race方法類似于競賽,若干個實例同時進行,最先抵達終點者即告成功,并解決該成功者,或者某個實例在途中發(fā)生意外導致異常,則宣告失敗,并拒絕該失敗者promise是什么意思起步網校,不論成功還是失敗,都優(yōu)先處理最先完成的那個。
Promise.try-- 提案
在運用promise過程中,期望被promise封裝的函數(shù)體中同步代碼同步運行,異步代碼異步處理,并且讓它們擁有共同的接口
例:當同步函數(shù)被promise包裝后的執(zhí)行順序改變。
定義一個函數(shù)fn,當被調用時,會打印出文字同步1
Promise.resolve().then(fn)

console.log('同步2')
//log后
//'同步2'
//'同步1'
解決讓同步函數(shù)同步執(zhí)行,異步函數(shù)異步執(zhí)行現(xiàn)階段方法
over~有問題留言
拓展:
借鑒: