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  

ブラウザー実装状況

Update compatibility data on GitHub
デスクトップモバイルサーバー
ChromeEdgeFirefoxInternet ExplorerOperaSafariAndroid webviewAndroid 版 ChromeEdge MobileAndroid 版 FirefoxAndroid 版 OperaiOSのSafariSamsung InternetNode.js
基本対応Chrome 完全対応 63Edge 完全対応 18Firefox 完全対応 58IE 未対応 なしOpera 完全対応 50Safari 完全対応 11.1WebView Android 完全対応 63Chrome Android 完全対応 63Edge Mobile 未対応 なしFirefox Android 完全対応 58Opera Android 完全対応 50Safari iOS 完全対応 11.1Samsung Internet Android 未対応 なしnodejs 完全対応 10.0.0

凡例

完全対応  
完全対応
未対応  
未対応

関連項目

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

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