Web・API -

finally 메소드#10

  • -

🤟finally 메소드(Promise 동작원리)

안녕하세요 TriplexLab 입니다.

이때까지 우리는 Promise객체의 then메소드와 catch메소드에 대해서 배웠습니다.
하지만 알아야 할 메소드가 하나더 남았습니다.

바로 finally 메소드 입니다.
만약 어떤 비동기 작업이 성공하든, 실패하든 상관 없이
그렇니깐 Promise 객체가 fulfilled 상태가 되든 , rejected 상태가 되든 상관 없이
항상 실행하고 싶은 콜백이 있을때는 어떻게 해야 할까요?

그런 콜백을 finally 메소드로 등록하면 됩니다.
일단 현재 코드에 finally 메소드를 추가해볼게요

fetch('https://jsonplaceholder.typicode.com/users')
	.then((response) => response.text())
	.then((result) => {console.log(result);})
	.catch((error) => {console.log(error);})

자, finally 메소드는 보통 이렇게 Promise Chaining에서 catch메소드 보다도 더 뒤에 씁니다.
이렇게 쓰면 finally 메소드 안에 콜백은 그 전에 Promise 객체가 fulfilled 상태가 되든 , rejected 상태가 되든
상관 없이 항상 실행되게 됩니다.

fetch('https://jsonplaceholder.typicode.com/users')
	.then((response) => response.text())
	.then((result) => {console.log(result);})
	.catch((error) => {console.log(error);})
	.finally(() => {console.log('exit');});

그렇니까 어떤 경우든 항상 저 부분이 실행 되어서 ‘exit’ 이라는 문자열이 출력 될것 입니다.
그리고 finally 메소드 안에 콜백은 작업 성공 결과나, 작업 실패 정보가 필요하지 않기 때문에
딱히 파라미터가 필요 없다는게 특징 입니다.
그래서 지금 콜백에 아무 파라미터도 없는것 입니다.

어떤 경우든 항상 실행 됨.

자 이 코드를 한번 실행해 보겠습니다.
response 내용이 출력된 다음 ‘exit’이라는 단어가 잘 출력 됩니다.
그럼 이번엔 Promise객체를 rejected 상태로 만들고 그때도 ****finally 메소드 안에 콜백이 실행 되는지 보겠습니다.

결과

존재 하지 않은 URL을 실행해 보겠습니다.
이렇게 하면 catch메소드 안에 콜백이 실행 되겠죠.
음.. 이렇게 하면 catch메소드가 리턴했던 Promise객체가 fulfilled 상태가되고, undifind를 작업 성공 결과로 갖게 됩니다.
catch메소드가 리턴한 Promise객체를 rejected 상태 만들기 위해서 catch메소드안에서
에러를 발생 시켜 볼게요

존재 하지 않은 URL을 실행

자 이렇게 수정하면
catch메소드가 리턴한 Promise객체가 rejected 상태가 되겠죠.
이런데도 finally 메소드의 콜백은 실행 됩니다.
코드를 실행 해보면

finally 메소드의 콜백

finally 메소드 안에 콜백은 잘 실행 되었네요
이 결과의 의미는 에러를 처리하는 catch메소드에서 에러가 발생하더라도
finally 메소드 안에 콜백은 실행 된다는 뜻 입니다.

exit 출력 결과

이걸 다시 말하면 finally는
정상적인 경우든, 최악의 경우든 상관 없이 항상 무조건 실행 해야 하는 코드가 있을때 사용한다는 것 입니다.
예를 들어서 Promise Chaining에서 작업을 수행하기 위해서 사용했던 자원을 정리한다 던가
어떤 로그 기록을 남겨야 한다 던가, 어떠한 경우든 항상 특정 변수의 값을 변경해줘야 할때
이 finally메소드를 사용합니다.
finally메소드 위치와, 사용 용도를 잘 기억해주세요.
finally메소드는 보통 catch메소드 뒤에 씁니다.

finally메소드는 보통 catch메소드 뒤에 씁니다.

Contents

포스팅 주소를 복사했습니다

이 글이 도움이 되었다면 공감 부탁드립니다.