Q1: Promise.finally란 무엇인가요?
A1: `promise.finally`는 비동기 작업이 성공(resolve)하든 실패(reject)하든 상관없이 실행되는 콜백을 등록하는 메서드입니다. 보통 리소스 정리나 상태 초기화 같은 공통 후처리 작업에 사용됩니다.
Q2: Promise.finally의 기본 사용법은 어떻게 되나요?
A2:
```javascript
somePromise
.then(result => {
// 성공 처리
})
.catch(error => {
// 실패 처리
})
.finally(() => {
// 성공/실패와 무관하게 항상 실행
});
```
Q3: finally 콜백 함수는 인자를 받나요?
A3: 아니요. `finally`에 전달되는 콜백 함수는 인자를 받지 않습니다. 따라서 결과값이나 에러 객체를 직접 전달받아 처리할 수 없습니다.
Q4: finally 내부에서 반환값이나 에러를 던지면 어떻게 되나요?
A4:
- 만약 `finally` 콜백이 값을 반환하면 그 값은 무시되고 원래 Promise의 결과가 이어집니다.
- 하지만 콜백 내부에서 에러를 throw 하면 최종 Promise는 reject 상태가 됩니다. 즉, 기존 결과가 새 오류로 대체됩니다.
Q5: finally와 then/catch의 차이점은 무엇인가요?
A5: `then`과 `catch`는 각각 성공과 실패 시의 후처리를 위해 사용하지만, `finally`는 성공/실패와 무관하게 항상 같은 작업을 수행할 때 사용합니다.
Q6: finally는 비동기 작업 내에서 어떻게 동작하나요?
A6: `finally` 내부에서 Promise를 반환하면 최종 Promise가 그 Promise의 완료를 기다립니다. 즉, `finally`가 비동기 작업일 경우 완료될 때까지 다음 단계로 넘어가지 않습니다.
```javascript
somePromise.finally(() => {
return new Promise(resolve => setTimeout(resolve, 1000)); // 1초 대기 후 완료
});
```
Q7: finally는 어디에 주로 사용되나요?
A7:
- 로딩 상태 해제
- 리소스 정리 (예: 파일 닫기, 커넥션 종료)
- 공통 상태 초기화
Q8: 브라우저 지원과 폴리필은 어떻게 되나요?
A8: `Promise.finally`는 비교적 최신 기능으로, 구형 브라우저에서는 지원하지 않을 수 있어 폴리필 사용을 권장합니다.
---
요약하면, `promise.finally`는 프로미스의 성공/실패 여부와 무관하게 항상 실행되는 후처리 코드를 작성할 때 유용하며, 인자를 받지 않고, 내부에서 에러를 던지면 전체 체인의 에러로 전파된다는 점을 유의해야 합니다.
`Promise.<a href='https://sangseek.com/sangseeks/finally/ko'>finally</a>()`는 JavaScript의 Promise 객체에서 제공하는 메서드로, 비동기 작업이 완료된 후 반드시 실행되는 코드를 정의할 수 있게 해줍니다. 이 메서드는 Promise가 성공적으로 이행되거나 거부된 후에 실행되는 콜백 함수를 등록할 수 있습니다. `finally()`는 주로 <a href='https://sangseek.com/sangseeks/리소스 정리/ko'>리소스 정리</a>, 로딩 스피너 숨기기, 또는 공통적인 후처리 작업을 수행하는 데 유용합니다. 기본 사용법 `finally()` 메서드는 <a href='https://sangseek.com/sangseeks/Promise 체인/ko'>Promise 체인</a>의 마지막에 위치하며, Promise가 이행되거나 거부된 후에 실행됩니다. 다음은 `finally()`의 기본적인 사용 예시입니다: ```javascript const myPromise = new Promise((resolve, reject) => { // 비동기 작업 수행 <a href='https://sangseek.com/sangseeks/setTimeout/ko'>setTimeout</a>(() => { // 성공적으로 작업이 완료되면 resolve 호출 resolve("작업 완료!"); // 또는 오류가 발생하면 reject 호출 // reject("오류 발생!"); }, 1000); }); myPromise .then(result => { console.log(result); // "작업 완료!" 출력 }) .catch(error => { console.error(error); // 오류 발생 시 처리 }) .finally(() => { console.log("비동기 작업이 완료되었습니다."); // 항상 실행됨 }); ``` 위의 예제에서 `finally()` 블록은 Promise가 이행되거나 거부된 후에 항상 실행됩니다. 따라서 성공적인 결과가 출력된 후에도 "비동기 작업이 완료되었습니다."라는 메시지가 출력됩니다. `finally()`의 특징 1. 반환값 : `finally()` 메서드는 항상 원래의 Promise를 반환합니다. 따라서 `finally()`를 호출한 후에도 `then()`이나 `catch()`를 계속 체이닝할 수 있습니다. 2. 에러 처리 : `finally()` 블록 내에서 발생한 오류는 Promise 체인의 에러 처리기(`catch`)로 전달되지 않습니다. 이는 `finally()`가 항상 실행되기 때문에, 그 안에서 발생한 오류는 무시되거나 처리되지 않을 수 있습니다. 3. 비동기 작업 : `finally()` 블록 내에서 비동기 작업을 수행할 수 있지만, 이 경우 `finally()`는 비동기 작업이 완료될 때까지 기다리지 않습니다. 즉, `finally()` 블록이 끝난 후에 비동기 작업이 실행될 수 있습니다. 예제: 비동기 작업과 함께 사용하기 ```javascript const fetchData = () => { return new Promise((resolve, reject) => { setTimeout(() => { resolve("데이터 수신 완료"); }, 2000); }); }; fetchData() .then(data => { console.log(data); // "데이터 수신 완료" 출력 }) .catch(error => { console.error("오류:", error); }) .finally(() => { console.log("<a href='https://sangseek.com/sangseeks/데이터 요청/ko'>데이터 요청</a>이 완료되었습니다."); // 항상 실행됨 }); ``` 사용 사례 1. 로딩 스피너 : 비동기 작업이 진행되는 동안 로딩 스피너를 표시하고, 작업이 완료되면 스피너를 숨기는 데 사용할 수 있습니다. 2. 리소스 정리 : 데이터베이스 연결, 파일 핸들러 등과 같은 리소스를 정리하는 데 유용합니다. 3. 공통 후처리 : 여러 Promise 체인에서 공통적으로 수행해야 하는 후처리 작업을 정의할 수 있습니다. 결론 `Promise.finally()`는 비동기 프로그래밍에서 매우 유용한 도구로, Promise의 <a href='https://sangseek.com/sangseeks/이행 여부/ko'>이행 여부</a>와 관계없이 항상 실행되는 코드를 작성할 수 있게 해줍니다. 이를 통해 코드의 가독성을 높이고, 공통적인 후처리 작업을 간결하게 처리할 수 있습니다. 비동기 작업을 다룰 때 `finally()`를 적절히 활용하면, 코드의 안정성과 유지보수성을 향상시킬 수 있습니다.