日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

【Promise】promise關鍵問題和解決辦法

作者:DC... 更新時間: 2024-03-01 編程語言

Promise關鍵問題

文章目錄

  • Promise關鍵問題
    • 修改用戶的狀態
    • 執行多個回調
    • 改變狀態和指定回調的順序
    • then方法返回結果特點
    • promise串聯多個操作任務
    • promise異常穿透
    • 中斷promise鏈

修改用戶的狀態

如果沒有經過res(value)或者rej(value),當前狀態一般都是pedding

    <script>
        let p = new Promise((res,rej)=> {
            //res('ok') // 成功情況下 把原來的pending => fulfilled(res)
            //rej('err')  // 失敗時 把pending => rejected
            //拋出錯誤
            throw '出問題'
        })
        console.log(p);
    </script>

執行多個回調

promise指定多個成功/失敗的回調函數,當promise改變為對應狀態的時候調用

    <script>
      let p = new Promise((res, rej) => {
        res('ok')       //當pending => fulfilled(res),就可以執行以下回調,若不執行res,即pedding沒有改變,則無法進去回調
      })
      //指定回調1
      p.then(val => {
        console.log(val)
      })
      //指定回調2
      p.then(val => {
        alert(val)
      })
    </script>

改變狀態和指定回調的順序

同步任務下是先改變狀態后執行回調;異步任務下是先執行回調后改變狀態(下面代碼輸出ppp)

先改變狀態后執行回調方法

1、在執行器中直接調用res()/rej()

2、延長更長事件才調用then

得到數據的方法

不管先改變狀態還是后改變狀態,一定是通過res/rej來觸發then的回調

    <script>
      // 同步任務下是先改變狀態后執行回調;異步任務下是先執行回調后改變狀態
      let p = new Promise((res, rej) => {
        setTimeout(()=> {
          res('ok')
        },1000)
      })
      p.then(val => {
        console.log('ppp')
      })
    </script>

then方法返回結果特點

promise.then()返回新promise的結果狀態由then()指定的回調函數執行的結果決定

    <script>
      // 同步任務下是先改變狀態后執行回調;異步任務下是先執行回調后改變狀態
      let p = new Promise((res, rej) => {
        // setTimeout(()=> {
          res('ok')
        // },1000)
      })
      let result=p.then(val => {
        // console.log('ppp')
        // 1 拋出問題
        // throw '問題'
        // 2、返回的結果是非promise對象
        // return 555
        // 3、返回的結果是promise對象
        return new Promise((res, rej) => {
          //res('success')  //promise的值為success
          rej('err')        //promise的值為err
      })

      },reason=> {
        console.warn(reason);
      })
      console.log(result);
    </script>

promise串聯多個操作任務

promise.then()返回一個新的promise,可以開成then()鏈式調用

通過then()鏈式調用串聯多個同步/異步任務

    <script>
      let p = new Promise((res, rej) => {
        setTimeout(()=> {
          res('ok')
        },1000)
      })
      p.then(val => {
        return new Promise((res, rej) => { //如果沒有return默認返回undefined
          res('success')  
      })
      },reason=> {
        console.warn(reason);
      }).then(val => {
        console.log(val);  //獲取的結果是success
      }).then(val => {
        console.log(val);  //獲取的結果是undefined
      })
      // (第一個then)p.then返回結果是Promise,而Promise狀態由他所指定的回調函數的返回值決定, 倒數第二個(then)中的promise回調沒有聲明返回值
    </script>

promise異常穿透

在使用promise的then鏈式調用時,可以在最后指定失敗的回調

前面任何操作出了異常,可以在最后指定失敗的回調

    <script>
      let p = new Promise((res, rej) => {
        setTimeout(()=> {
          rej('不ok')
        },1000)
      })
      p.then(val => {
        console.log(111);
      }).then(val => {
        console.log(222); 
      }).then(val => {
        console.log(333);
      }).catch(err=> {
        console.warn(err);
      })
    </script>

中斷promise鏈

在使用promise的鏈式調用時,在中間中斷,不再調用后面的回調函數

辦法:在回調函數中返回一個pedding狀態的promise對象

    <script>
      let p = new Promise((res, rej) => {
        setTimeout(()=> {
          res('不ok')
        },1000)
      })
      p.then(val => {
        console.log(111);
        //想要中斷promise鏈,有且只有一個辦法,就是把狀態改回pedding,當狀態為pedding的時候就不會再執行then
        return new Promise(()=> {} )
      }).then(val => {
        console.log(222); 
      }).then(val => {
        console.log(333);
      }).catch(err=> {
        console.warn(err);
      })
    </script>

原文鏈接:https://blog.csdn.net/m0_63779088/article/details/126700726

  • 上一篇:沒有了
  • 下一篇:沒有了
欄目分類
最近更新