Promise((res, rej) => {})
resolve와 reject 중 하나는 무조건 실행된다. const promise = new Promise((resolve, reject) => {
console.log('Here is a promise');
});
//Output: 'Here is a promise'
setTimeout
을 사용하면 아래와 같이 코드를 수정할 수 있다. const promise = new Promise((resolve, reject) => {
console.log('Here is a promise');
setTimeout(() => {
resolve('James');
}, 2000);
});
// 2초 동안 어떠한 작업을 진행한 후 resolve 콜백함수를 통해 `James`라는 값을 반환하는 Promise producer
then
, catch
, finally
를 사용해서 Promise를 사용할 수 있다. const promise = new Promise((resolve, reject) => {
console.log('Here is a promise');
setTimeout(() => {
resolve('James');
}, 2000);
});
promise
.then(value => {
console.log(value);
});
//Output: James
then
은 resolve를 통해 반환되는 값이 인자로 받는 함수이다.then
의 인자를 찍으면 James가 출력된다. const promise = new Promise((resolve, reject) => {
console.log('Here is a promise');
setTimeout(() => {
//resolve('James');
reject(new Error('No User Info Available'));
}, 2000);
});
promise
.then(value => {
console.log(value);
})
.catch(error => {
console.log(error);
});
//Output: Error: No User Info Available
catch
는 반대로 executor 함수가 정상적으로 작동하지 않았을 경우를 다룬다. No User Info Available
이라는 Error를 반환하게 한다. then
뒤에 catch
를 체이닝해서 reject를 통해 반환되는 값을 찍어보면 콘솔창에 에러가 뜬다.then
뒤에 바로 catch
를 체이닝할 수 있는 이유는 then
도 결국 똑같은 Promise를 반환하기 때문이다. 이 체이닝이 이해가 안된다면 아래 예시를 참고하면 된다. let str = 'ayaye';
let replaced = str
.replaceAll('aya', 1)
.replaceAll('ye', 2);
console.log(replaced);
//output: 12
finally
는 코드의 성공/실패 여부와 상관없이 무조건 진행되는 내용이다. const promise = new Promise((resolve, reject) => {
console.log('Here is a promise');
setTimeout(() => {
resolve('James');
//reject(new Error('No User Info Available'));
}, 2000);
});
promise
.then(value => {
console.log(value);
})
.catch(error => {
console.log(error);
})
.finally(() => {
console.log('promise is over!');
});
/*
Output:
James
promise is over!
*/
const getPig = () =>
new Promise((res, rej) => {
setTimeout(() => res('🐷'), 1000);
})
const getFire = pig =>
new Promise((res, rej) => {
setTimeout(() => res(`${pig} + 🔥`), 1000);
})
const getBacon = fire =>
new Promise((res, rej) => {
setTimeout(() => res(`${fire} = 🥓`), 1000);
})
getPig()
.then(getFire)
.then(getBacon)
.then(console.log)
//Output: 🐷 + 🔥 = 🥓
Example Reference: 드림코딩: 자바스크립트 12. 프로미스 개념부터 활용까지 JavaScript Promise | 프론트엔드 개발자 입문편 (JavaScript ES6)