promise
Promise 是異步編程的一種解決方案,比傳統(tǒng)的解決方案——回調(diào)函數(shù)和事件——更合理且更強(qiáng)大。它最早由社區(qū)提出并實(shí)現(xiàn),ES6將其寫(xiě)進(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)地獄問(wèn)題,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ù)。