resolve()와 reject()
resolve() 함수는 JavaScript의 Promise 객체와 관련된 함수입니다. Promise 객체는 비동기 작업이 성공적으로 완료되었거나 실패했을 때의 결과를 나타내는데 사용됩니다. Promise 객체는 일반적으로 두 개의 함수를 인자로 받는데, 이들은 resolve와 reject 함수입니다.
resolve: 비동기 작업이 성공적으로 완료되었을 때 호출되는 함수입니다. resolve를 호출하면 Promise는 "fulfilled" (이행된) 상태가 되며, 이 경우 연결된 .then() 핸들러가 실행됩니다.
reject: 비동기 작업이 실패했거나 오류가 발생했을 때 호출되는 함수입니다. reject를 호출하면 Promise는 "rejected" (거부된) 상태가 되며, 이 경우 연결된 .catch() 핸들러가 실행됩니다.
여기서 resolve() 함수의 호출은 fetchManager 함수 내의 비동기 작업 (여기서는 HTTP 요청)이 성공적으로 완료되었음을 나타내며, 이 함수가 끝났음을 알립니다. Promise를 사용하는 주된 목적은 비동기 작업의 완료나 실패를 처리하는 것이며, resolve와 reject 함수는 이러한 처리를 가능하게 합니다.
fetchManager 함수에서 resolve()가 호출되는 시점은 API 요청이 성공적으로 완료되고, 관련된 Redux 액션이 디스패치된 후입니다. 이를 통해 fetchManager 함수를 사용하는 다른 부분에서 .then()을 사용하여 이 함수가 성공적으로 완료된 후의 추가 작업을 정의할 수 있습니다.
resolve() 함수를 호출하지 않으면, Promise가 "fulfilled" (이행된) 상태로 전환되지 않습니다. 이는 Promise 기반의 비동기 작업에서 중요한 부분입니다. resolve()의 호출 여부에 따른 영향을 구체적으로 살펴보겠습니다:
resolve()가 호출되지 않는 경우:
Promise는 완료되었다는 신호를 받지 못합니다. 이는 Promise가 계속 "pending" (대기) 상태에 머무르게 됩니다.
.then() 핸들러 또는 await 표현식이 Promise의 결과를 기다리는 경우, 이들은 계속 대기 상태에 머물게 됩니다. 즉, 해당 Promise가 완료되었다는 신호를 받지 못하여 이후의 코드 실행이 중단되거나 지연됩니다.
이는 비동기 작업이 성공적으로 완료되었음에도 불구하고, 그 결과를 적절하게 처리하거나 다음 단계의 작업으로 진행되지 않음을 의미합니다.
reject()도 호출되지 않는 경우:
Promise가 실패했다는 신호도 받지 못합니다. 따라서 .catch() 블록 또한 실행되지 않습니다.
이 경우, Promise는 성공도 실패도 아닌, 끝나지 않은 상태로 남게 됩니다.
에러 핸들링의 문제:
resolve() 또는 reject()가 호출되지 않는 경우, 에러 핸들링을 적절하게 할 수 없습니다. 예를 들어, Promise의 완료 여부에 따라 UI를 업데이트하거나 사용자에게 피드백을 제공하는 작업이 제대로 이루어지지 않을 수 있습니다.
따라서, Promise를 사용할 때는 비동기 작업의 완료 여부에 상관없이 항상 resolve() 또는 reject()를 적절한 시점에 호출하여 Promise가 정상적으로 완료되거나 실패했음을 명시하는 것이 중요합니다. 이는 비동기 프로그래밍에서 예측 가능한 동작을 보장하고, 더 나은 에러 핸들링과 코드의 신뢰성을 제공합니다.