基本使用
const mypro = new Promise((resolve,reject)=>{
resolve(成功了)
reject(失敗了)
// 注意 結(jié)果只會(huì)更改一次,一旦改變立刻凍結(jié)。不會(huì)在發(fā)生第二次改變。
})
API
-
Promise.resolve()快速創(chuàng)建一個(gè)成功的Promise實(shí)例對(duì)象 -
Promise.reject()快速創(chuàng)建一個(gè)失敗的Promise實(shí)例對(duì)象 -
Promise.all([p1,p2,p3])接受一個(gè)數(shù)組作為參數(shù),數(shù)組成員均為promise實(shí)例對(duì)象,返回一個(gè)promise實(shí)例對(duì)象。如果數(shù)組中所有成員都resolve()則成功,如果有一個(gè)成員reject,則返回的promise也是reject
const p1 = new Promise((resolve,reject) => {
resolve(1)
});
const p2 = Promise.resolve(2);
const p3 = Promise.reject(3);
// 如果promise都為resolve,則all的結(jié)果也是resolve
// 只要有一個(gè)不是reject,則all為reject
const all = Promise.all([p1,p2,p3])
all.then(value=>{
console.log(value);
}).catch(err => {
console.log('出錯(cuò)了 ' + err);
})
-
Promise.race([p1,p2,p3])接受一個(gè)數(shù)組作為參數(shù),數(shù)組成員均為promise實(shí)例對(duì)象,返回一個(gè)promise實(shí)例對(duì)象。數(shù)組中成員第一個(gè)執(zhí)行完畢的結(jié)果將會(huì)作為返回promise對(duì)象的結(jié)果。
const p1 = new Promise((resolve,reject) => {
setTimeout(() => {
resolve(1)
}, 2000);
});
const p2 = Promise.resolve(2);
const p3 = Promise.reject(3);
// 取最先完成的promise結(jié)果
const all = Promise.race([p1,p2,p3])
all.then(value=>{
console.log(value);
}).catch(err => {
console.log('出錯(cuò)了 ' + err);
})
關(guān)于promise的幾個(gè)問(wèn)題
如何改變promise的狀態(tài)
1. resolve() ---> (狀態(tài)變?yōu)閞esolved)
2. reject() ---> (狀態(tài)變?yōu)閞ejected)
3. 內(nèi)部拋出異常 ---> (狀態(tài)變?yōu)閞ejected)
給promise指定多個(gè)成功\失敗的回調(diào)函數(shù),都會(huì)調(diào)用嗎?
- 當(dāng)promise改變狀態(tài)時(shí),都會(huì)調(diào)用綁定的回調(diào)函數(shù)。
promise.then()返回的新promise狀態(tài)由什么決定?
- 簡(jiǎn)單表達(dá):由
then指定的回調(diào)函數(shù)運(yùn)行結(jié)果決定 - 詳細(xì)表達(dá):
- ① 如果拋出異常,新
promise狀態(tài)變?yōu)?code>rejected - ② 如果返回的是非
promise,新promise變?yōu)?code>resolve,value為返回的值 - ③ 如果返回一個(gè)
promise,則返回的promise的結(jié)果會(huì)成為新promise的結(jié)果
- ① 如果拋出異常,新
promise如何串聯(lián)多個(gè)操作任務(wù)?
- promise的then()返回一個(gè)新的promise,可以使用then()的鏈?zhǔn)秸{(diào)用
- 通過(guò)then()的鏈?zhǔn)秸{(diào)用串聯(lián)多個(gè)同步\異步任務(wù)
// promise串聯(lián)多個(gè) 同步|異步 任務(wù)
new Promise((resolve,reject)=>{
setTimeout(()=>{
console.log('異步任務(wù)1 開(kāi)始');
resolve(1)
},1000)
}).then((value)=>{
console.log('異步任務(wù)1 結(jié)果:' + value);
console.log('同步任務(wù)2 開(kāi)始');
return 2
})
.then((value)=>{
console.log('同步任務(wù)2 結(jié)果:' + value);
console.log('異步任務(wù)3 開(kāi)始');
// 如果是異步任務(wù) 則需要用promise對(duì)象來(lái)返回其值
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve(3)
},1000)
})
})
.then((value)=>{
// 1s后輸出 3
console.log('異步任務(wù)3 結(jié)果:' + value);
})
promise錯(cuò)誤的穿透
- 如果promise的狀態(tài)變成reject,不會(huì)跳過(guò)then方法直接調(diào)用catch,而是在then中逐層傳遞錯(cuò)誤信息,直達(dá)catch捕獲。相當(dāng)于then的第二個(gè)參數(shù)被執(zhí)行了,執(zhí)行的默認(rèn)值就是
err=>Promise.reject(err)
如何中斷promise鏈
- 返回一個(gè)pending狀態(tài)的promise即可。
.then(()=>{
return new Promise(()=>{})
}).then(()=>{
console.log('我不會(huì)被執(zhí)行?。?!')
})