promise的簡(jiǎn)單理解

(1):promise對(duì)象


 什么是promsie,promise字面就是承諾,承諾一段時(shí)間做出回應(yīng)

 promise產(chǎn)生的歷史原因,回調(diào)函數(shù)的層層嵌套的回調(diào)"地獄",不夠優(yōu)雅和易用

 promise的三種狀態(tài) pending fulfilled reject

 promise的特點(diǎn)
 promise的狀態(tài)不可逆,要么是成功要么是失敗,當(dāng)處于pending狀態(tài),未知是成功還是失敗
 promise的結(jié)果必須通過(guò)回調(diào)函數(shù)返回出去,不然就會(huì)處于pending未知狀態(tài)
 promise對(duì)象的狀態(tài)不受外界影響。


(2): new Promise對(duì)象

let p = new Promise((resolve,reject)=>{
  setTimeout(() => {
    // resolve("success-1")
    reject("err-0")
  }, 3000);
})

p.then(res=>{
  console.log(res);

//   錯(cuò)誤捕捉的第一種寫(xiě)法
// },error=>{  
//   console.log("error",error)
// })
  // 錯(cuò)誤捕捉的第二種寫(xiě)法
}).catch(err=>{
  console.log(err);
})

(3): Promise.resolve

let p = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve("success-1")
    // reject("err-0")
  }, 3000);
})


let p1 = p.then(res=>{
  console.log(res);
  return res
}).catch(err=>{
  console.log(err);
})


let p2 = p1.then(res=>{
  console.log("p1-res",res); //p1-res success-1
  // return new Promise((resolve,reject)=>{
  //   resolve(res)
  // })
  // 當(dāng)然也可以這樣簡(jiǎn)寫(xiě)
 // return Promise.resolve(res) 
 // 當(dāng)然也可以這樣
 return res
})


p2.then(res=>{
  console.log("p2-res",res); // p2-res success-1
})

(4):promise.all

let p = new Promise((resolve,reject)=>{
  setTimeout(() => {
    // resolve("success-1")
    reject("err-0")
  }, 3000);
})

p.then(res=>{
  console.log(res);

//   錯(cuò)誤捕捉的第一種寫(xiě)法
// },error=>{  
//   console.log("error",error)
// })
  // 錯(cuò)誤捕捉的第二種寫(xiě)法
}).catch(err=>{
  console.log(err);
})

// promsie.all 處理并發(fā)請(qǐng)求

let p1 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve(11)
  }, 1000);
})

let p2 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve(22)
  }, 1000);
})

let p3 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    reject(33)
  }, 1000);
})

let p4 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve(44)
  }, 1000);
})
let arr = [p1,p2,p3,p4]
Promise.all(arr).then(res=>{ // 對(duì)于有一個(gè)報(bào)錯(cuò),只會(huì)返回當(dāng)前對(duì)應(yīng)的隊(duì)列的promise的錯(cuò)誤消息
  console.log("res===",res)
}).catch(err=>{
  console.log("err===",err); // 33 
})
  • 很顯然我們想要所有的結(jié)果(不管是成功還是失敗),那么如何解決promise.all的錯(cuò)誤造成其它promise不執(zhí)行
    <font color="#f60">1: 批量處理promiseAll錯(cuò)誤</font>
// 批量處理promsie錯(cuò)誤、
async function watchPromiseError(p) {
  try {
    console.log("p",p);
    const data = await p;
    return {
      err:0,
      res: data
    }
  } catch (error) {
    return {
      err: 1,
      res:error
    }
  }
}
let arr = [p1,p2,p3,p4]
Promise.all(arr.map(item=>watchPromiseError(item))).then(res=>{ // 對(duì)于有一個(gè)報(bào)錯(cuò),只會(huì)返回當(dāng)前對(duì)應(yīng)的隊(duì)列的promise的錯(cuò)誤消息
  console.log("res===",res) 
  /*   { err: 0, res: 11 },
  { err: 0, res: 22 },
  { err: 1, res: 33 },
  { err: 0, res: 44 } */
}).catch(err=>{
  console.log("err===",err); // 33 
})

<font color="#f60">2: 批量處理promiseAll錯(cuò)誤</font>

let arr = [p1,p2,p3,p4]
Promise.allSettled(arr).then(res=>{ // 對(duì)于有一個(gè)報(bào)錯(cuò),只會(huì)返回當(dāng)前對(duì)應(yīng)的隊(duì)列的promise的錯(cuò)誤消息
  console.log("res===",res) 
  /*    { status: 'fulfilled', value: 11 },
  { status: 'fulfilled', value: 22 },
  { status: 'rejected', reason: 33 },
  { status: 'fulfilled', value: 44 } */
}).catch(err=>{
  console.log("err===",err); // 33 
})

(5):promise.race

  • <font color="#f60">race顧名思義就是賽跑的意思,誰(shuí)快執(zhí)行誰(shuí)</font>
let p1 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve(11)
  }, 1000);
})

let p2 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve(22)
  }, 1000);
})

let p3 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    reject(33)
  }, 1000);
})

let p4 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve(44)
  }, 1000);
})

let arr = [p1,p2,p3,p4]
Promise.race(arr).then(res=>{
  console.log("res===",res) // 22
}).catch(err=>{
  console.log("err===",err); 
})
在這里插入圖片描述
  • <font color="#f60">那么我們給p1改為2秒</font>
let p1 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    resolve(11)
  }, 2000);
})

在這里插入圖片描述
  • <font color="#f60">對(duì)于報(bào)錯(cuò)呢race怎么處理,是不是也是只返回執(zhí)行最快的那個(gè)promise對(duì)象錯(cuò)誤消息呢</font>
  • <font color="#f60">我們把p1改為reject</font>
let p1 = new Promise((resolve,reject)=>{
  setTimeout(() => {
    reject(11)
  }, 1000);
})
在這里插入圖片描述

(5): 面試官你TM會(huì)promise,倒是就手寫(xiě)一個(gè)啊


class MyPromise {
  constructor(executor) {
    // 規(guī)定狀態(tài)
    this.state = "pending"
    // 保存 `resolve(res)` 的res值
    this.value = undefined
    // 保存 `reject(err)` 的err值
    this.reason = undefined
    // 成功存放的數(shù)組
    this.successCB = []
    // 失敗存放的數(shù)組
    this.failCB = []


    let resolve = (value) => {
      if (this.state === "pending") {
        this.state = "fulfilled"
        this.value = value
        this.successCB.forEach(f => f())
      }
    }
    let reject = (reason) => {
      if (this.state === "pending") {
        this.state = "rejected"
        this.value = value
        this.failCB.forEach(f => f())
      }
    }

    try {
      // 執(zhí)行
      executor(resolve, reject)
    } catch (error) {
      // 若出錯(cuò),直接調(diào)用reject
      reject(error)
    }
  }
  then(onFulfilled, onRejected) {
    if (this.state === "fulfilled") {
      onFulfilled(this.value)
    }
    if (this.state === "rejected") {
      onRejected(this.value)
    }
    if (this.state === "pending") {
      this.successCB.push(() => { onFulfilled(this.value) })
      this.failCB.push(() => { onRejected(this.reason) })
    }
  }
}



let p11 = new MyPromise((resolve,reject)=>{
  setTimeout(() => {
    reject(11)
  }, 100);
})
p11.then(res=>{
  console.log("res",res); // 11
})
?著作權(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)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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

  • 1:promise是什么 2:promise的三種狀態(tài) **1. pending (等待) fulfilled(成...
    You_d39d閱讀 537評(píng)論 0 1
  • 目錄: 1.概述 2.基本用法2.1 創(chuàng)建Promise2.2 then方法2.3 catch方法2.4 其他創(chuàng)建...
    darjun閱讀 7,635評(píng)論 2 6
  • Promise 的含義 一句話概括一下promise的作用:可以將異步操作以同步操作的流程表達(dá)出來(lái),避免了層層嵌套...
    雪萌萌萌閱讀 5,656評(píng)論 0 7
  • Rn開(kāi)發(fā)中較難理解且應(yīng)用頻繁的地方 1 含義 首先是一個(gè)對(duì)象 , 類似于回掉函數(shù)。 所謂Promise,簡(jiǎn)單說(shuō)就...
    小魚(yú)兒喜歡花無(wú)缺閱讀 628評(píng)論 0 1
  • 開(kāi)始的異步處理方式 開(kāi)始的異步處理方式是這種通過(guò)callback進(jìn)行處理,一步步去處理,當(dāng)需要處理N步時(shí)就要有N個(gè)...
    隔壁王胖子閱讀 431評(píng)論 0 1

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