promise
Promise 是異步編程的一種解決方案聊疲,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理且更強(qiáng)大竣况。它最早由社區(qū)提出并實(shí)現(xiàn)坯沪,ES6將其寫進(jìn)了語(yǔ)言標(biāo)準(zhǔn),統(tǒng)一了用法扛芽,并原生提供了Promise對(duì)象骂蓖。
- 含義: Promise是異步編程的一種解決方案,
- 優(yōu)點(diǎn): 相比傳統(tǒng)回調(diào)函數(shù)和事件更加合理和優(yōu)雅川尖,Promise是鏈?zhǔn)骄幊蹋ê竺鏁?huì)詳細(xì)講述)登下,有效的解決了令人頭痛的回調(diào)地獄問題,Promise的結(jié)果有成功和失敗兩種狀態(tài)叮喳,只有異步操作的結(jié)果被芳,可以決定當(dāng)前是哪一種狀態(tài),外界的任何操作都無(wú)法改變這個(gè)狀態(tài)
- 基本用法:
我們用Promise的時(shí)候一般是包在一個(gè)函數(shù)中馍悟,在需要的時(shí)候去運(yùn)行這個(gè)函數(shù)畔濒,如:
function p1(){
return new promise((resolve,reject)=>{
// 一些邏輯代碼
if(true){
resolve()
}else{
reject();
}
})
}
// then 是一個(gè)函數(shù)。有兩個(gè)參數(shù)赋朦,第一個(gè)參數(shù)就是接收resolve返回的數(shù)據(jù)篓冲。第二個(gè)參數(shù)接收reject返回的數(shù)據(jù)李破。
p1().then((data)=>{
// 接收resolve 返回的數(shù)據(jù)
},(data)=>{
// 接收reject的返回的數(shù)據(jù)
});
// catch // 接收reject傳來(lái)的數(shù)據(jù)或者捕捉到then()中的運(yùn)行報(bào)錯(cuò)時(shí),做些什么
p1().catch(()=>{
})
// 不管什么狀態(tài)都會(huì)執(zhí)行到這
p.finally(()=>{
})
常用API
- resolve 返回異步操作成功的結(jié)果
- reject 返回異步操作失敗的結(jié)果
- then 執(zhí)行Promise狀態(tài)是成功的操作
- catch 執(zhí)行Promise狀態(tài)是失敗的操作
- finally 不管Promise狀態(tài)是成功或失敗都執(zhí)行的操作
Promise.all
Promise.all方法用于將多個(gè) Promise 實(shí)例壹将,包裝成一個(gè)新的 Promise 實(shí)例嗤攻。
function p1(){
return new Promise((resolve)=>{
console.log("打印p1");
resolve("p1");
})
}
function p2(){
return new Promise((resolve)=>{
console.log("打印p2");
resolve("p2");
})
}
function p3(){
return new Promise((resolve)=>{
console.log("打印p3");
resolve("p3");
})
}
const p = Promise.all([p1(), p2(), p3()]).then((datas){
console.log(data);
})
//打印p1
//打印p2
//打印p3
//["p1", "p2", "p3"]
p的狀態(tài)由p1、p2诽俯、p3決定妇菱,分成兩種情況。
(1)只有p1暴区、p2闯团、p3的狀態(tài)都變成fulfilled,p的狀態(tài)才會(huì)變成fulfilled仙粱,此時(shí)p1房交、p2、p3的返回值組成一個(gè)數(shù)組伐割,傳遞給p的回調(diào)函數(shù)候味。
(2)只要p1、p2隔心、p3之中有一個(gè)被rejected白群,p的狀態(tài)就變成rejected,此時(shí)第一個(gè)被reject的實(shí)例的返回值硬霍,會(huì)傳遞給p的回調(diào)函數(shù)帜慢。