November 15, 2021
promise
객체는 아래와 같은 문법으로 만들 수 있습니다.
let promise = new Promise(function(resolve, reject) {
// executor (제작 코드, '가수')
});
new Promise
에 전달되는 함수는 executor(실행자, 실행 함수) 라고 부릅니다. executor는 new Promise
가 만들어질 때 자동으로 실행되는데, 결과를 최종적으로 만들어내는 제작 코드를 포함합니다. 위 비유에서 '가수’가 바로 executor입니다.
executor의 인수 resolve
와 reject
는 자바스크립트에서 자체 제공하는 콜백입니다. 개발자는 resolve
와 reject
를 신경 쓰지 않고 executor 안 코드만 작성하면 됩니다.
대신 executor에선 결과를 즉시 얻든 늦게 얻든 상관없이 상황에 따라 인수로 넘겨준 콜백 중 하나를 반드시 호출해야 합니다.
resolve(value)
— 일이 성공적으로 끝난 경우 그 결과를 나타내는 value
와 함께 호출reject(error)
— 에러 발생 시 에러 객체를 나타내는 error
와 함께 호출요약하면 다음과 같습니다. executor는 자동으로 실행되는데 여기서 원하는 일이 처리됩니다. 처리가 끝나면 executor는 처리 성공 여부에 따라 resolve
나 reject
를 호출합니다.
한편, new Promise
생성자가 반환하는 promise
객체는 다음과 같은 내부 프로퍼티를 갖습니다.
state
— 처음엔 "pending"
(보류)이었다 resolve
가 호출되면 "fulfilled"
, reject
가 호출되면 "rejected"
로 변합니다.result
— 처음엔 undefined
이었다 resolve(value)
가 호출되면 value
로, reject(error)
가 호출되면 error
로 변합니다.이행(resolved) 혹은 거부(rejected) 상태의 프라미스는 ‘처리된(settled)’ 프라미스라고 부릅니다. 반대되는 프라미스로 '대기(pending)'상태의 프라미스가 있습니다.
프라미스 객체는 executor(‘제작 코드’ 혹은 ‘가수’)와 결과나 에러를 받을 소비 함수(‘팬’)를 이어주는 역할을 합니다. 소비함수는 .then
, .catch
, .finally
메서드를 사용해 등록(구독)됩니다.
try {...} catch {...}
에 finally 절이 있는 것처럼, 프라미스에도 finally
가 있습니다.