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

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

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

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