비동기 작업을 관리하고, 해당 작업의 성공, 실패 결과를 나중에 사용할 수 있도록 하는 객체
즉, 비동기 작업의 완료 여부를 약속해주는 개념
JS는 비동기 처리를 위한 콜백 함수를 많이 사용함
그러한 코드가 복잡해지면 콜백 지옥 문제가 발생됨
Promise는 이러한 비동기 처리의 가독성을 높이고, 코드의 흐름을 명확하게 관리할 수 있도록 도와주는 방식
3가지 상태를 가지고 있음
1. 비동기작업이 아직 완료되지 않은 초기 상태 나타내는 pending
2. 비동기 작업이 성공적으로 완료되어 값을 반환한 상태인 Fulfilled
3. 마지막으로 비동기 작업이 실패하여 오류를 반환한 상태인 Rejected
이 중 하나로 전환되면, 이후 다른 상태로 전환되지 않으며, Fulfilled나 Rejected상태가 되면 결과 값을 통해 해당 작업의 성공 여부를 알 수 있음
Promise 객체는 비동기 작업을 수행할 함수를 인자로 받아서 실행, 이 함수는 resolve와 reject라는 두 가지 콜백을 받음
resolve는 비동기 작업이 성공했을 때 값을 전달하여 Promise를 fulfilled상태로 전환, reject는 비동기 작업이 실패했을 때 오류를 전달하여 rejected상태로 전환
try-catch-finally 구조로 비동기 작업의 실패와 에러, 또 마지막 부분에 대한 처리를 명시적으로 나타내줄 수 있음
Promise는 코드의 가독성 높이고, 비동기 작업의 흐름을 제어하는데 유용함
여러 개의 promise를 순차적으로 연결할 수 있고 Promise.all이나 allSettled같은 메서드를 통해 병렬로 비동기 작업을 처리해 볼 수도 있음
그러나
단점은 복잡한 에러처리가 있음
단일 체인에선 에러 처리가 간단하지만, 여러 Promise가 중첩되거나 서로 다른 비동기 흐름에서 에러가 발생한 경우 복잡도가 증가함
ex - then체인 내의 중간 단계에서 오류가 발생하면 catch 블록에서 캐치해주긴하지만, 특정 단계에서만 발생하는 에러를 세밀히 다루긴 어려움. 따라서 비동기 흐름에서 발생하는 다양한 에러를 모두 처리할 시 코드가 복잡해짐
두번째로는 콜백지옥이 완벽히 해결되진 않음
어느정도는 해결할 수 있으나, 비동기 작업 중첩시 여전히 여러 then메서드를 사용함으로써 가독성이 떨어짐
이를 극복하기 위해 async/await을 통해 개선할 수 있음