Promise.prototype.finally()
Baseline
Widely available
This feature is well established and works across many devices and browser versions. Itâs been available across browsers since â¨2018ë 10ìâ©.
Promise ì¸ì¤í´ì¤ì finally() ë©ìëë íë¡ë¯¸ì¤ë¥¼ ì²ë¦¬í í(ì´íëê±°ë ê±°ë¶ë í) í¸ì¶í í¨ì를 ìì½í©ëë¤.
ì´ ë©ìëë ì¦ì ëë±í Promise ê°ì²´ë¥¼ ë°ííë¯ë¡ íë¡ë¯¸ì¤ ì²´ì´ëì´ ê°ë¥í©ëë¤.
finally() ë©ìë를 ì¬ì©íë©´ then() ì catch() ì²ë¦¬ê¸° ì ì½ë ì¤ë³µì í¼í ì ììµëë¤.
ìëí´ ë³´ê¸°
function checkMail() {
return new Promise((resolve, reject) => {
if (Math.random() > 0.5) {
resolve("Mail has arrived");
} else {
reject(new Error("Failed to arrive"));
}
});
}
checkMail()
.then((mail) => {
console.log(mail);
})
.catch((err) => {
console.error(err);
})
.finally(() => {
console.log("Experiment completed");
});
문ë²
promiseInstance.finally(onFinally)
매ê°ë³ì
onFinally-
íë¡ë¯¸ì¤ê° ì²ë¦¬ë í ë¹ë기ì ì¼ë¡ ì¤íë í¨ìì ëë¤. ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ë°ííì§ ìë ì´ì ë°í ê°ì 무ìë©ëë¤. í¨ìë ì¸ì ìì´ í¸ì¶ë©ëë¤.
ë°í ê°
ë°í ê°ì ì¸ì¤í´ì¤ì ëì¼í Promise ì
ëë¤. ë§ì½ ì²ë¦¬ê¸°ìì ìì¸ê° ë°ìíê±°ë ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ë°ííë©´, finally()ê° ë°íí íë¡ë¯¸ì¤ë ëì ê·¸ ê°ì¼ë¡ ê±°ë¶ë©ëë¤. ì´ì¸ìë ì²ë¦¬ê¸°ì ë°í ê°ì ìë íë¡ë¯¸ì¤ì ìíì ìí¥ì ì£¼ì§ ììµëë¤.
ì¤ëª
finally() ë©ìëë ê²°ê³¼ì ê´ê³ìì´ íë¡ë¯¸ì¤ê° ì²ë¦¬ëê³ ëì 무ì¸ê°ë¥¼ ì²ë¦¬íê±°ë ì 리í ë ì ì©í©ëë¤.
finally() ë©ìëë then(onFinally, onFinally) 를 í¸ì¶íë ê²ê³¼ ë§¤ì° ë¹ì·íì§ë§ ëª ê°ì§ ì°¨ì´ì ì´ ììµëë¤.
- í¨ì를 ì¸ë¼ì¸ì¼ë¡ ë§ë¤ ë, ë ë² ì ì¸íê±°ë ë³ìì í ë¹í íì ìì´ í ë²ë§ ì¬ì©í´ì ì ë¬í ì ììµëë¤.
onFinallyì½ë°±ì ì¸ì를 ë°ì§ ììµëë¤. ì´íë ê° í¹ì ê±°ë¶ë ì´ì ì 무ê´íê² ì²ë¦¬íë ê²½ì°ìë§ ì¤íëë¯ë¡ ì¸ìê° íìíì§ ììµëë¤.finally()í¸ì¶ì ë³´íµ ì¸ë¶ì ìí¥ì ë°ì§ ìì¼ë©° ìë íë¡ë¯¸ì¤ì ìµì¢ ìí를 ë³ê²½íì§ ììµëë¤. ë¤ì ìì를 ì°¸ê³ íì¸ì.Promise.resolve(2).then(() => 77, () => {})ë77ë¡ ì´íë©ëë¤. ì´ìë ë¤ë¥´ê²,Promise.resolve(2).finally(() => 77)ë2ë¡ ì´íë©ëë¤.- ì ì¬íê²
Promise.reject(3).then(() => {}, () => 88)ë88ë¡ ê±°ë¶ë©ëë¤. ì´ìë ë¬ë¦¬Promise.reject(3).finally(() => {})ë3ë¡ ê±°ë¶ë©ëë¤.
ì°¸ê³ :
finally ì½ë°± ë´ ìì¸ ë°ì ëë ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ë°ííë ê²½ì°ìë ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤. ì를 ë¤ì´ Promise.reject(3).finally(() => { throw 99; }) ì Promise.reject(3).finally(() => Promise.reject(99)) ë 모ë 99ë¡ ê±°ë¶ë íë¡ë¯¸ì¤ë¥¼ ë°íí©ëë¤.
catch()ì²ë¼ , finally()ë ë´ë¶ì ì¼ë¡ ìì ì í¸ì¶í ê°ì²´ì then ë©ìë를 í¸ì¶í©ëë¤. onFinallyê° í¨ìê° ìë ê²½ì°, then()ì ë ì¸ì 모ë onFinallyë¡ ëì´ê° í¸ì¶ëë©°, ì¦ Promise.prototype.then()ìê² ì ì©í ì²ë¦¬ê¸°ê° í¬í¨ëì§ ìëë¤ë ì미ì
ëë¤. ê·¸ ì¸ì ê²½ì° then()ì ë´ë¶ì ì¼ë¡ ìì±ë ë ê°ì í¨ìì í¨ê» í¸ì¶ëë©°, ë¤ìê³¼ ë¹ì·íê² ëìí©ëë¤.
ê²½ê³ : ë¤ìì ì¤ëª ì ìí ììì´ë©° ì¤ì í´ë¦¬íì´ ìëëë¤.
promise.then(
(value) => Promise.resolve(onFinally()).then(() => value),
(reason) =>
Promise.resolve(onFinally()).then(() => {
throw reason;
}),
);
finally() ë©ìëê° then() ì í¸ì¶í기 ë문ì ìë¸í´ëì±ì ì§ìí©ëë¤. ì ììì Promise.resolve() í¸ì¶ì 주목íì¸ì. ì¤ì ë¡ onFinally() ì ë°í ê°ì Promise.resolve() ì ëì¼í ë°©ìì¼ë¡ ì´íë©ëë¤. íì§ë§ ì´íë íë¡ë¯¸ì¤ì ì§ì§ ìì±ìë ìë¸í´ëì¤ê° ë©ëë¤. finally() ë ì´ ìì±ì를 promise.constructor[@@species] ìì ì»ìµëë¤.
ìì
>finally() ì¬ì©í기
let isLoading = true;
fetch(myRequest)
.then((response) => {
const 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((json) => {
/* JSON ì²ë¦¬ */
})
.catch((error) => {
console.error(error); // ì´ ì¤ë ì¤ë¥ê° ë°ìí ì ììµëë¤. (ì: console = {})
})
.finally(() => {
isLoading = false;
});
ëª ì¸ì
| Specification |
|---|
| ECMAScript® 2026 Language Specification > # sec-promise.prototype.finally > |