프라미스
let promise = new Promise(function(resolve, reject) {
// ...
});
executor 함수 내부 작업 성공 시
excutor 함수 내부 작업 실패 시
resolve든, reject든 일단 작업이 마무리 된 상태를 settled promise라고 함
작업이 진행중인 프라미스를 pending promise라고 함
resolve 함수 실행
let promise = new Promise(function(resolve, reject) {
setTimeout(() => resolve("done!"), 1000);
});
// resolve 함수는 then의 첫 번째 함수(인수)를 실행
promise.then(
result => alert(result), // 1초 후 "done!"을 출력
error => alert(error) // 실행되지 않음
);
reject 함수 실행
let promise = new Promise(function(resolve, reject) {
setTimeout(() => reject(new Error("에러 발생!")), 1000);
});
// reject 함수는 then의 두 번째 함수를 실행
promise.then(
result => alert(result), // 실행되지 않음
error => alert(error) // 1초 후 "Error: 에러 발생!"를 출력
);
let promise = new Promise((resolve, reject) => {
setTimeout(() => reject(new Error("에러 발생!")), 1000);
});
// catch(f)는 promise.then(null, f)과 동일하게 작동함
promise.catch(alert); // 1초 뒤 "Error: 에러 발생!" 출력
new Promise((resolve, reject) => {
setTimeout(() => resolve("결과"), 2000)
})
.finally(() => alert("프라미스가 준비되었습니다.")) // 성공에 상관없이 출력
.then(result => alert(result)); // <-- then에서 result를 다룰 수 있음
new Promise((resolve, reject) => {
throw new Error("에러 발생!");
})
.finally(() => alert("프라미스가 준비되었습니다.")) // 실패에 상관없이 출력
.catch(err => alert(err)); // <-- catch에서 에러 객체를 다룰 수 있음
new Promise(function(resolve, reject) {
// (*)
setTimeout(() => resolve(1), 1000);
}).then(function(result) {
// resolve 호출의 결과로 전달된 값(1)이 result로 넘어옴 (**)
alert(result); // 1
// 여기서 2가 반환되지만, 내부적으로 반환값을 resolve 함수로 전달하는 Promise 객체를 생성하여 반환하므로, 결과적으로 연쇄적인 then 메서드 호출이 가능함
return result * 2;
// 위의 코드는 내부적으로는 아래와 같은 작업을 실행하는 코드로 바뀌어서 실행됨을 유의!
// return new Promise(resolve => resolve(result * 2));
}).then(function(result) {
// (***)
alert(result); // 2
return result * 2;
}).then(function(result) {
alert(result); // 4
return result * 2;
});
new Promise((resolve, reject) => {
// 예외 발생 (이 경우 reject 함수를 호출하며 해당 예외 객체를 전달한 것과 똑같은 결과
가 발생함)
throw new Error("에러 발생!");
// 다음과 같이 바깥에 보이지 않는 try - catch 블록이 존재한다고 생각하기
/*
try {
// ...
} catch(e) {
reject(new Error("에러 발생!"));
}
*/
})
.catch(alert); // Error: 에러 발생!