Promise.prototype.finally()

finally() 方法會回傳一個 Promise。當 promise 被 settled 後,無論其結果是 fulfilled 還是 rejected ,都會執行指定的回呼函數。它提供了一個讓 Promise 在被確認後,無論是 fulfilled 或是 rejected 都會執行某些程式碼的一種手段。

這樣可以避免你在 promise 的 then()catch() 重複處理相同的程式碼。

Syntax

p.finally(onFinally);

p.finally(function() {
   // settled(fulfilled 或 rejected)
});

Parameters

onFinally
Promise settled 後呼叫的 Function

Return value

回傳 Promisefinally 的處理函數 onFinally 被指定時。

Description

當你希望在 promise settled 後且不關心它的結果為何時,執行一些處理或清理的工作, finally() 方法會很有幫助。

finally() 方法非常類似於 .then(onFinally, onFinally) 的呼叫方式,但仍有一些差異:

  • 當建立行內的函數時,可以只傳遞一次,從而避免重複宣告或為它宣告變數。
  • finally 的回呼函數並不會接收到任何引數,因其沒有可靠的方式來確認 promise 是被 fulfilled 還是 rejected 。它的使用情境僅適用於當你不關心 rejection 的原因或 fulfillment 的值,因此無須提供。範例:
    • Promise.resolve(2).then(() => {}, () => {})(將被 resolved 為undefined)不同,Promise.resolve(2).finally(() => {}) 將被 resolved 為2
    • 同樣的,與 Promise.reject(3).then(() => {}, () => {})(將 fulfilled 為undefined)不同,Promise.reject(3).finally(() => {}) 將被 rejected 為3

備註: 在 finally 回呼中使用 throw (或回傳 rejected promise)會導致新的 promise 被 reject , reject 的原因則是呼叫 throw() 時所指定的值。

Examples

let isLoading = true;

fetch(myRequest).then(function(response) {
    var contentType = response.headers.get("content-type");
    if(contentType && contentType.includes("application/json")) {
      return response.json();
    }
    throw new TypeError("Oops, we haven't got JSON!");
  })
  .then(function(json) { /* process your JSON further */ })
  .catch(function(error) { console.log(error); })
  .finally(function() { isLoading = false; });

Specifications

Specification Status Comment
ECMAScript (ECMA-262)
The definition of 'Promise.prototype.finally' in that specification.
Living Standard

Browser compatibility

BCD tables only load in the browser

See also