Promise的整理

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í)行

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容