--- title: Promise.prototype.finally() slug: Web/JavaScript/Reference/Global_Objects/Promise/finally tags: - JavaScript - Method - Promises - Prototype - Reference - finally translation_of: Web/JavaScript/Reference/Global_Objects/Promise/finally ---
finally()
メソッドは {{jsxref("Promise")}} を返します。プロミスが確立したら、満足か拒否かにかかわらず、指定されたコールバック関数が実行されます。これにより、プロミスが成功裏に実行されたか否かに関わりなく、 Promise
が処理された後に実行されなければならないコードを提供できます。
これによって、プロミスの {{jsxref("Promise.then", "then()")}} ハンドラーと {{jsxref("Promise.catch", "catch()")}} ハンドラーでコードが重複することを避けることができます。
p.finally(onFinally); p.finally(function() { // 確立 (満足または拒否) });
onFinally
Promise
が確立したら呼び出される {{jsxref("Function")}}。finally
ハンドラーに指定した onFinally
が設定した {{jsxref("Promise")}} を返します。
プロミスが確立した後、結果に関わらず何らかの処理や後始末を行いたいなら、finally()
メソッドは役立ちます。
finally()
メソッドは .then(onFinally, onFinally)
の呼び出しとよく似ていますが、いくつかの点が異なります。
finally
コールバックは一切引数を受け取りません。このユースケースは、拒否された理由や履行された値などを提供する必要がなく、それらを気にしないときに適しています。
Promise.resolve(2).then(() => {}, () => {})
(undefined
で解決される) と異なり、Promise.resolve(2).finally(() => {})
は 2
で解決される。Promise.reject(3).then(() => {}, () => {})
(undefined
で解決される) と異なり、Promise.reject(3).finally(() => {})
は 3
で拒否される。補足: finally
コールバック内で throw
が行われた場合 (または、拒否されたプロミスを返した場合)、 throw
を呼び出すときに指定された拒否理由と共に新しいプロミスが拒否されます。
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.error(error); /* this line can also throw, e.g. when console = {} */ }) .finally(function() { isLoading = false; });
Please do not add polyfills on MDN pages. For more details, refer to: https://discourse.mozilla.org/t/mdn-rfc-001-mdn-wiki-pages-shouldnt-be-a-distributor-of-polyfills/24500
仕様書 |
---|
{{SpecName('ESDraft', '#sec-promise.prototype.finally', 'Promise.prototype.finally')}} |
{{Compat("javascript.builtins.Promise.finally")}}