亚洲激情专区-91九色丨porny丨老师-久久久久久久女国产乱让韩-国产精品午夜小视频观看

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

JS中Promise的使用及封裝方法是什么

發布時間:2023-03-06 14:44:30 來源:億速云 閱讀:91 作者:iii 欄目:開發技術

這篇文章主要介紹了JS中Promise的使用及封裝方法是什么的相關知識,內容詳細易懂,操作簡單快捷,具有一定借鑒價值,相信大家閱讀完這篇JS中Promise的使用及封裝方法是什么文章都會有所收獲,下面我們一起來看看吧。

    Promise 是什么

    • Promise 是異步編程的一種解決方案,比傳統的解決方案——回調函數和事件——更合理和更強大。

    • 簡單說就是一個容器,里面保存著某個未來才會結束的事件(通常是一個異步操作)的結果。

    • 從語法上說,Promise 是一個對象,從它可以獲取異步操作的消息。Promise 提供統一的 API,各種異步操作都可以用同樣的方法進行處理。

    Promise 的特點

    1. 對象的狀態不受外界影響。Promise 對象代表一個異步操作,有三種狀態:pending(進行中)、fulfilled(已成功)和 rejected(已失敗)。只有異步操作的結果,可以決定當前是哪一種狀態,任何其他操作都無法改變這個狀態。這也是 Promise 這個名字的由來,它的英語意思就是“承諾”,表示其他手段無法改變

    2. 一旦狀態改變,就不會再變,任何時候都可以得到這個結果。Promise 對象的狀態改變,只有兩種可能:從 pending 變為 fulfilled 和從 pending 變為 rejected。只要這兩種情況發生,狀態就凝固了,不會再變了,會一直保持這個結果,這時就稱為 resolved(已定型)。如果改變已經發生了,你再對 Promise 對象添加回調函數,也會立即得到這個結果。這與事件(Event)完全不同,事件的特點是,如果你錯過了它,再去監聽,是得不到結果的。

    3. 將異步操作以同步操作的流程表達出來,避免了層層嵌套的回調函數(回調地獄)

    Promise 的缺點

    • 1. 無法取消 Promise,一旦新建它就會立即執行,無法中途取消

    • 2. 如果不設置回調函數,Promise內部拋出的錯誤,不會反應到外部

    • 3. 當處于pending狀態時,無法得知目前進展到哪一個階段(剛剛開始還是即將完成)

    Promise 的原理

    ES6 規定,Promise 對象是一個構造函數,用來生成 Promise 實例。通過在函數內部 return 一個 Promise 對象的實例,這樣就可以使用 Promise 的屬性和方法進行下一步操作了。    

    Promise 構造函數接受一個函數作為參數,該函數的兩個參數分別是 resolve 和 reject。它們是兩個函數,由 JavaScript 引擎提供,不用自己部署

    const promise = new Promise(function(resolve, reject) {
      if (/* 異步操作成功 */){
        resolve(value)
      } else {
        reject(error)
      }
    })

    Promise 的方法

    1. Promise.prototype.then()

    then()方法就是把原來的回調寫法分離出來,在異步操作執行完后,用鏈式調用的方式執行回調函數。

    而 Promise的優勢就在于這個鏈式調用。

    我們可以在 then 方法中繼續寫 Promise 對象并返回,然后繼續調用 then 來進行回調操作。

    resolve 的用法

    let promise = new Promise(function(resolve, reject) {
      console.log('Promise')
      resolve('已完成')
    });
    
    promise.then(function(data) {
      console.log('resolved.',data)
    })
    
    console.log('Hi!')
    
    //  Promise
    //  Hi!
    //  resolved. 123

    reject 的用法

    reject 方法就是把 Promise 的狀態置為已失敗(Rejected),這時 then 方法執行“失敗”情況的回調(then 方法的第二參數)

    let promise = new Promise(function(resolve, reject) {
      reject('NO')
    });
    
    promise.then(function(data) {
      console.log('resolved.',data)
    },function(data){
      console.log('rejected.',data)
    })
    
    //  rejected. NO

    2. Promise.prototype.catch()

    如果異步操作拋出錯誤,當前 Promise 對象狀態就會變為 rejected,就會調用 catch 方法指定的回調函數,處理這個錯誤。

    另外,then 方法指定的回調函數,如果運行中拋出錯誤,也會被 catch 方法捕獲。

    catch 方法返回的也是一個 Promise 對象,因此后面還可以接著調用then方法。

    const promise = new Promise(function(resolve, reject) {
      resolve('OK')
    })
    
    promise.then(function(data) {
      console.log(data)
      console.log(num)
    }).catch(function(err) {
      console.log(err)
    })
    
    // OK
    // ReferenceError: num is not defined

    3. Promise.prototype.finally()

    finally 方法用于指定不管 Promise 對象最后狀態如何,在執行完 then 或 catch 指定的回調函數以后,都會執行 finally 方法指定的回調函數。

    finally 方法的回調函數不接受任何參數,在 finally 方法里面的操作,與狀態無關,不依賴于 Promise 的執行結果。

    // 服務器使用 Promise 處理請求,然后使用 finally 方法關掉服務器
    server.listen(port)
      .then(function () {
        // ...
      })
      .finally(server.stop)

    4. Promise.all()

    Promise 的 all 方法(傳入一個數組,每一項分別是一個 Promise 實例)提供了并行執行異步操作的能力,并且在所有異步操作執行完(所有實例的狀態都變成 fulfilled)或者 只要有一個 Promise 實例的狀態變為 reject,Promise.all 的狀態就會變為 reject,然后執行回調。可以將數組里的 Promise 看成是 “與” 關系。

    應用場景:打開網頁時,預先加載需要用到的各種資源如圖片、flash 以及各種靜態文件。所有的都加載完后,我們再進行頁面的初始化

    //買作業本
    function cutUp() {
      console.log('挑作業本')
      var p = new Promise(function(resolve, reject) { //做一些異步操作
        console.log('挑好購買作業本')
          resolve('新的作業本')
      })
      return p
    }
            
    //買筆
    function boil() {
      console.log('挑筆芯')
      var p = new Promise(function(resolve, reject) { //做一些異步操作
        console.log('挑好購買筆芯')
        resolve('新的筆芯')
      });
      return p
    }
    
    Promise.all([cutUp(),boil()]).then(function(res) {
      console.log("寫作業的工具都買好了")
      console.log(res)
    })
    
    // 挑作業本
    // 挑好購買作業本
    // 挑筆芯
    // 挑好購買筆芯
    // 寫作業的工具都買好了
    // ["新的作業本", "新的筆芯"]

    5. Promise.race()

    Promise.race 方法( 傳入一個數組,每一項分別是 Promise 實例 )的用法與 all 一樣,異步操作同樣是并行執行的。只不過 all 是等所有異步操作都執行完畢后才執行 then 回調。race 可以看到 是 “或” 關系,只要有一個異步操作執行完畢,就會立刻執行 then 回調。

    應用場景:用 race 給某個異步請求設置超時時間,并且在超時后執行相應的操作

    //買作業本
    function cutUp() {
      console.log('挑作業本')
      var p = new Promise(function(resolve, reject) { //做一些異步操作
        console.log('挑好購買作業本')
          resolve('新的作業本')
      })
      return p
    }
            
    //買筆
    function boil() {
      console.log('挑筆芯')
      var p = new Promise(function(resolve, reject){ //做一些異步操作
        console.log('挑好購買筆芯')
        resolve('新的筆芯')
      })
      return p
    }
    
    Promise.race([cutUp(),boil()]).then(function(res){
      console.log("寫作業的工具都買好了")
      console.log(res)
    })
    
    // 挑作業本
    // 挑好購買作業本
    // 挑筆芯
    // 挑好購買筆芯
    // 寫作業的工具都買好了
    // 新的作業本

    5. Promise.allSettled()

    Promise.allSettled() 方法接受一組 Promise 實例作為參數,包裝成一個新的 Promise 實例 。

    只有等到所有這些參數實例都返回結果,不管是 fulfilled 還是 rejected,包裝實例才會結束。

    Promise.allSettled()的返回值該是一個數組,數組里每個對象都有 status 屬性,該屬性的值只可能是字符串 fulfilled 或字符串rejected。

    fulfilled 時,對象有 value 屬性,rejected 時有 reason 屬性,對應兩種狀態的返回值。

    應用場景:不關心異步操作的結果,只確保所有異步操作都結束

    //買作業本
    function cutUp() {
      console.log('挑作業本')
      var p = new Promise(function(resolve, reject) { //做一些異步操作
        console.log('挑好購買作業本')
          resolve('新的作業本')
      })
      return p
    }
            
    //買筆
    function boil() {
      console.log('挑筆芯')
      var p = new Promise(function(resolve, reject){ //做一些異步操作
        console.log('挑好購買筆芯')
        reject('購買不了,沒錢了')
      })
      return p
    }
    
    Promise.allSettled([cutUp(),boil()]).then(function(res){
      console.log("寫作業的工具沒有買齊")
      console.log(res)
    })
    
    // 挑作業本
    // 挑好購買作業本
    // 挑筆芯
    // 挑好購買筆芯
    // 寫作業的工具沒有買齊
    // [
    //   {status: "fulfilled", value: "新的作業本"}
    //   {status: "rejected", reason: "購買不了,沒錢了"}
    // ]

    Promise 的簡單封裝

    function promiseM(callback) {
        this.status = 'pendding'
        this.msg = ''
    
        callback((data) => {
            this.status = 'resolve'
            this.msg = data
        },(err) => {
        if (this.status === 'resolve') return
            this.status = 'reject'
            this.msg = err
        })
    }
    
    promiseM.prototype.then = function () {
        let cb = arguments
        let that = this
        let timer = setInterval(function () {
            if(that.status == 'resolve') {
                cb[0](that.msg)
                clearInterval(timer)
            } else if(that.status == 'reject') {
                if(!cb[1]) {
                    clearInterval(timer)
                    throw that.msg + ' No Exit'
                } else {
                    cb[1](that.msg)
                    clearInterval(timer)
                }
            }
        }, 500)
    }
    
    function fn() {
        return new promiseM(function (resolve, reject) {
            resolve('success')
        })
    }
    
    fn().then(function (res) {
        console.log(res)
    })
    
    // success

    關于“JS中Promise的使用及封裝方法是什么”這篇文章的內容就介紹到這里,感謝各位的閱讀!相信大家對“JS中Promise的使用及封裝方法是什么”知識都有一定的了解,大家如果還想學習更多知識,歡迎關注億速云行業資訊頻道。

    向AI問一下細節

    免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

    AI

    明水县| 鄂州市| 盖州市| 塔河县| 重庆市| 台湾省| 哈巴河县| 略阳县| 包头市| 城市| 黄龙县| 甘泉县| 海门市| 高要市| 阜新市| 武定县| 绍兴市| 积石山| 凌云县| 黄浦区| 文昌市| 佳木斯市| 蒲江县| 虹口区| 洞口县| 礼泉县| 布尔津县| 奇台县| 高雄县| 贡山| 南投市| 嘉黎县| 读书| 安西县| 定日县| 乡城县| 湖北省| 黄平县| 罗定市| 浙江省| 鸡泽县|