프로미스(Promise) 객체는 비동기 작업의 최종 완료 또는 실패를 나타내는 객체입니다.
즉 비동기 함수의 실행 상태에 따라 각각의 함수를 호출하여 작업의 결과를 나타내는 것입니다.
예시
비동기적으로 이미지파일을 생성하는createImageFile() 이라는 함수가 있을 때, 이 함수의 파라미터로는 (1)이미지 파일의 이름, (2)성공 시 호출할 함수, (3)실패 시 호출할 함수가 있습니다.
function createImageFile(fileName, successCallBack, failureCallBack){
// 이미지 파일 생성중
if(success) successCallBack(fileName);
else failureCallBack(fileName);
}
프로미스가 나타낼 수 있는 상태는 세 가지가 있습니다.
대기(pending): 이행하지도, 거부하지도 않은 초기 상태
이행(fulfilled) : 작업이 완료된 상태(성공)
거부(rejected) : 작업이 거부된 상태(실패)
대기 상태에서 작업을 성공적으로 완료하는 것을 해결(resolve)라고 하고, 대기 상태에서 작업이 오류 발생 등 모종의 이유로 실패하는 것을 거부(reject)라고 합니다.
프로미스 객체 사용해보기
프로미스 객체는 함수를 콜백을 전달하는 대신에 콜백을 첨부하는 방식입니다.
위에서 살펴본 프로미스 객체의 자세한 사용 방법을 알아보겠습니다.
객체 생성
let myPromise1 = new Promise((resolve, reject) => {
// 비동기 작업
});
프로미스 객체의 생성자를 사용했습니다.
프로미스의 생성자 매개변수에는 콜백 함수가 들어가고, 그 콜백함수는 성공과 실패를 각각 나타내는 두 개의 객체를 매개변수로 받습니다.
resolve는 비동기 처리가 성공했을 때 호출하는 함수, reject는 비동기 처리가 실패했을 때 호출하는 함수입니다.
객체 처리 (then, catch, finally)
then
then은 프로미스에서 가장 중요한 메서드입니다.
사용 방법은 아래와 같습니다.
myPromise.then(
function(){}, // 성공 시 싫행하는 함수
function(){} // 실패 시 실행하는 함수
);
.then()의 첫 번째 인수는 프로미스의 비동기 처리가 성공했을 때 실행하는 함수이고,
두 번째 함수는 프로미스의 비동기 처리가 실패했을 때 실행하는 함수입니다.
catch
만약 프로미스의 비동기 처리가 실패한 경우만 다루고 싶다면 .catch()를 사용하면 됩니다.
myPromise.catch(
function(){} // 실패시 실행할 함수
);
.catch()를 사용하는 것은 .then()의 첫 번째 인수에 null을 입력하는 것과 같습니다.
*프로미스는 성공 또는 실패만 합니다.
하나의 비동기 처리에 대해 프로미스는 성공 또는 실패만 할 수 있습니다.
따라 resolve를 실행하면 reject를 호출할 수 없고, reject를 실행하면 resolve를 실행할 수 없습니다.