Promise語法用了很久,還沒有好好整理過。
語法
new Promise((resolve,reject)=>{})其中resolve代表執(zhí)行成功返回的,reject執(zhí)行失敗返回的
實例 1、
function t(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
try{
let ran = parseInt(Math.random() * 10);
ran < 5 ? resolve(true) : resolve(false);
}catch(e){
reject(e);
}
},parseInt(Math.random() * 301 + 200)) //200~500
})
}
//使用:
t() //鏈?zhǔn)秸{(diào)用
.then(res=>{})
.catch(e=>{})
值得注意的是:當(dāng)執(zhí)行了resolve函數(shù)時,后面的語句都不會在執(zhí)行
ran < 5 ? resolve(true) : resolve(false);在這一段語句后面添上其他語句,并不會執(zhí)行
Promise.all與Promise.race的區(qū)別
Promise.all顧名思義它會等待所有的Promise的狀態(tài)變?yōu)?code>resolve成功那么才會執(zhí)行.then,并且它會返回所有的Promise的resolve的值
而Promise.race它只會捕獲優(yōu)先執(zhí)行完成的那一個Promise的resolve的值,但是其他的Promise還是會執(zhí)行,但是捕獲不到值了
function t(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
try{
let ran = parseInt(Math.random() * 10);
console.log("執(zhí)行了")
resolve(ran );
}catch(e){
reject(e);
}
},parseInt(Math.random() * 301 + 200)) //200~500
})
}
let arr = Array.from({length:10}).fill(t);//填充十個Promise待執(zhí)行函數(shù)
Promise.all(arr.map(item=>item()))
.then(res=>{
console.log(res)
})
.catch(e=>{
console.log(e)
})
執(zhí)行結(jié)果

image.png
由此可見
Promise.all它會執(zhí)行完所有的Promise函數(shù)才執(zhí)行返回
Promise.race(arr.map(item=>item()))
.then(res=>{
console.log(res)
})
.catch(e=>{
console.log(e)
})
執(zhí)行結(jié)果

image.png
由此可見
Promise.race它只會捕獲優(yōu)先返回的那個值,但是其他的Promise不會因此而放棄執(zhí)行
引入async/await
讓語法更趨向與同步
function t(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
try{
let ran = parseInt(Math.random() * 10);
console.log("執(zhí)行了")
resolve(ran );
}catch(e){
reject(e);
}
},parseInt(Math.random() * 301 + 200)) //200~500
})
}
(async ()=>{
let result = await t();
//、、、dosome
})()
那么result就是函數(shù)的resolve返回值
如何捕獲異常?那么只能借助于try{}catch(e){}
(async ()=>{
try{
let result = await t();
}catch(e){
//異常處理
}
//、、、dosome
})()
思考如果我不用try catch如何捕獲異常?
function t(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
let ran = parseInt(Math.random() * 10);
ran <= 5 ? resolve(true) : reject(new Error("錯誤了"));
},parseInt(Math.random() * 301 + 200)) //200~500
})
}
(async()=>{
let d = await t().catch(e=>{return e});
console.log(typeof d)
})()
我只要區(qū)分d是
boolean還是object我就能知道是錯誤還是正確執(zhí)行,并不會中止代碼執(zhí)行