Promise.finally()——解讀JavaScript的全新方法

一、Promise.finally()定義及用途

Promise.finally()是ES2018新增的一個方法,可以被用於Promise鏈中任何位置,不管Promise實例最終的狀態如何,都會執行finally中的內容。

finally()處理完畢不會改變Promise的狀態,仍然返回和原來Promise狀態一樣的對象,常用於處理資源清理、取消網路請求時的任務取消等。

二、Promise.finally()的語法和返回

promiseInstance.finally(() => {
  //...執行的代碼
});

對於鏈式的Promise,Promise.finally()返回的Promise還是按照上一個狀態來處理。如果中途拋出異常,會影響到後面的執行。但是,finally()不會改變Promise原有狀態。

三、Promise.finally()的用法介紹

1. Promise鏈式調用中的finally()

const promise = new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve('成功')
  }, 1000)
})
promise.then(res => {
  console.log(res + '後執行')
  return res
}).finally(() => {
  console.log('先執行finally()')
})

上述代碼中,setTimeout設定1秒後resolve一個成功結果。在then後面鏈接了finally,在控制台中輸出順序如下:

  1. 任務一:成功後執行
  2. 任務二:先執行finally()

2. 處理ajax請求的finally()

axios.get('/user/12345')
  .then(function(res) {
    console.log(res.data);
  })
  .catch(function(error) {
    console.log(error);
  })
  .finally(function() {
    console.log('不管請求成功或失敗,我都會被執行');
  });

上述代碼中,非同步的ajax調用,不管是成功還是失敗,finally承擔著資源釋放和清理的作用。

4. Promise.all()使用finally()

Promise.all()會在所有非同步操作都執行完成後才會被解析,這時就需要利用finally()的特性來處理。

const p1 = Promise.resolve(1);
const p2 = Promise.resolve(2);
const p3 = new Promise((resolve) => setTimeout(resolve, 1000, 3))

Promise.all([p1, p2, p3]).then(result => console.log(result)).finally(() => {
  console.log('我最後被執行了')
})

上述代碼中,Promise.all()等待非同步的操作執行完畢,Promise.all()的then()會接收一個數組,包含了全部非同步完成後的結果。屬性結果之後,finally()被執行,表示所有非同步任務都已經完成了。

5. tslib庫實現Promise.finally()

npm install tslib

導入tslib庫中的polyfill使得我們可以在任何情況下使用Promise.finall()方法。如果瀏覽器自帶的Promise沒有實現finally()方法,就會導入tslib中的polyfill。

import 'tslib'

Promise.resolve(1).finally(() => {
  console.log('使用了tslib庫的finally()')
})

四、Promise.finally()的局限性

Promise.finaly()目前也存在著一定的局限性,在箭頭函數中無法使用break、continue等語句,因為和直接用代碼塊的finally不同,箭頭函數里的組合語句不可被終止。

五、結論

Promise.finally()是一個十分實用的方法,舒展了Promise鏈式調用的各個階段,可以為清理資源、取消操作、錯誤處理等行為提供很好的支持。

原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/190597.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
小藍的頭像小藍
上一篇 2024-11-30 09:05
下一篇 2024-11-30 09:05

相關推薦

  • 解決.net 6.0運行閃退的方法

    如果你正在使用.net 6.0開發應用程序,可能會遇到程序閃退的情況。這篇文章將從多個方面為你解決這個問題。 一、代碼問題 代碼問題是導致.net 6.0程序閃退的主要原因之一。首…

    編程 2025-04-29
  • ArcGIS更改標註位置為中心的方法

    本篇文章將從多個方面詳細闡述如何在ArcGIS中更改標註位置為中心。讓我們一步步來看。 一、禁止標註智能調整 在ArcMap中設置標註智能調整可以自動將標註位置調整到最佳顯示位置。…

    編程 2025-04-29
  • Python中init方法的作用及使用方法

    Python中的init方法是一個類的構造函數,在創建對象時被調用。在本篇文章中,我們將從多個方面詳細討論init方法的作用,使用方法以及注意點。 一、定義init方法 在Pyth…

    編程 2025-04-29
  • Python創建分配內存的方法

    在python中,我們常常需要創建並分配內存來存儲數據。不同的類型和數據結構可能需要不同的方法來分配內存。本文將從多個方面介紹Python創建分配內存的方法,包括列表、元組、字典、…

    編程 2025-04-29
  • Python中讀入csv文件數據的方法用法介紹

    csv是一種常見的數據格式,通常用於存儲小型數據集。Python作為一種廣泛流行的編程語言,內置了許多操作csv文件的庫。本文將從多個方面詳細介紹Python讀入csv文件的方法。…

    編程 2025-04-29
  • 用不同的方法求素數

    素數是指只能被1和自身整除的正整數,如2、3、5、7、11、13等。素數在密碼學、計算機科學、數學、物理等領域都有著廣泛的應用。本文將介紹幾種常見的求素數的方法,包括暴力枚舉法、埃…

    編程 2025-04-29
  • 使用Vue實現前端AES加密並輸出為十六進位的方法

    在前端開發中,數據傳輸的安全性問題十分重要,其中一種保護數據安全的方式是加密。本文將會介紹如何使用Vue框架實現前端AES加密並將加密結果輸出為十六進位。 一、AES加密介紹 AE…

    編程 2025-04-29
  • Python學習筆記:去除字元串最後一個字元的方法

    本文將從多個方面詳細闡述如何通過Python去除字元串最後一個字元,包括使用切片、pop()、刪除、替換等方法來實現。 一、字元串切片 在Python中,可以通過字元串切片的方式來…

    編程 2025-04-29
  • 用法介紹Python集合update方法

    Python集合(set)update()方法是Python的一種集合操作方法,用於將多個集合合併為一個集合。本篇文章將從以下幾個方面進行詳細闡述: 一、參數的含義和用法 Pyth…

    編程 2025-04-29
  • Vb運行程序的三種方法

    VB是一種非常實用的編程工具,它可以被用於開發各種不同的應用程序,從簡單的計算器到更複雜的商業軟體。在VB中,有許多不同的方法可以運行程序,包括編譯器、發布程序以及命令行。在本文中…

    編程 2025-04-29

發表回復

登錄後才能評論