finally() メソッドは、Promise を返します。成功・失敗にかかわらず、promise が確立したら指定したコールバック関数が実行されます。これにより、promise が成功裏に実行されたか否かに関わりなく、Promise が処理された後に実行されなければならないコードを提供できます。

これによって、promise の then() ハンドラーと catch() ハンドラーで重複するコードを避けられます。

構文

p.finally(onFinally);

p.finally(function() {
   // settled (resolved or rejected)
});

引数

onFinally
Promise が確立したら呼び出される Function

戻り値

finally ハンドラーに指定した onFinally が設定した Promise を返す。

説明

promise が確立した後、結果に関わらず何らかの処理やクリーンナップを行いたいなら、finally() メソッドは役立ちます。

finally() メソッドは .then(onFinally, onFinally) の呼び出しとよく似ていますが、いくつかの点が異なります:

  • 関数をインラインで作成する場合、関数を 2 度宣言するか、変数を作成するかのどちらかで、一度に渡すことができます。
  • promise が成功したか失敗したかを知る術がないため、finally コールバックは一切引数を受け取りません。このユースケースは、拒否された理由や履行された値などを提供する必要がなく、それらを気にしないときに適しています。
  • Promise.resolve(2).then(() => {}, () => {}) (undefined で解決される) と異なり、Promise.resolve(2).finally(() => {})2 で解決される。
  • 同様に、Promise.reject(3).then(() => {}, () => {}) (undefined で解決される) と異なり、Promise.reject(3).finally(() => {})3 で解決される。

ノート: finally コールバック内で throw (または、拒否された promise を返す) 場合、throw() を呼び出すときに指定された拒否理由と共に新しい promise が拒否されます。

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; });

仕様

仕様 ステータス コメント
TC39 proposal ステージ 4  

ブラウザー実装状況

機能ChromeEdgeFirefoxInternet ExplorerOperaSafari
基本対応63 なし58 なし50 なし
機能Android webviewChrome for AndroidEdge mobileFirefox for AndroidOpera AndroidiOS SafariSamsung Internet
基本対応6363 なし5850 なし なし

関連項目

ドキュメントのタグと貢献者

このページの貢献者: YuichiNukiyama
最終更新者: YuichiNukiyama,