筆記-promise

基本使用

const mypro = new Promise((resolve,reject)=>{
  resolve(成功了)
  reject(失敗了)
  // 注意 結(jié)果只會(huì)更改一次,一旦改變立刻凍結(jié)。不會(huì)在發(fā)生第二次改變。
})

API

  1. Promise.resolve() 快速創(chuàng)建一個(gè)成功的Promise實(shí)例對(duì)象
  2. Promise.reject() 快速創(chuàng)建一個(gè)失敗的Promise實(shí)例對(duì)象
  3. 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);
  })
  1. 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ù)?
  1. promise的then()返回一個(gè)新的promise,可以使用then()的鏈?zhǔn)秸{(diào)用
  2. 通過(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í)行?。?!')
})
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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