๐ง JS์์ ํจ์๋ฅผ ํธ์ถํ์ ๋ ๊ทธ ์ฝ๋๊ฐ ์คํ ๋๋ ๋์, ํจ์ ๋ฐ์ ๋ค๋ฅธ ์ฝ๋๋ ํจ๊ป ์คํ์ด ๋์ด์ผํ๋ค.
console.log(Promise);
//[Function: Promise]
์ฅ์ ๐๐ป
- ๋น๋๊ธฐ ์์ ์ด ๋ง์์ ธ๋ ์ฝ๋์ ๊น์ด๊ฐ ๊น์ด์ง์ง ์๋๋ค.
๋จ์ ๐๐ป
- ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋์ ์๋ฌ๊ฐ ๋ฐ์ํ๋์ง ์ ์ ์๋ค.
- ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ๋ถ๊ธฐ๋ฅผ ๋๋๋ ์์ ์ด ์ด๋ ต๋ค.
โฃ async-await์ผ๋ก ํด๊ฒฐํ ์ ์์
new Promise(/* executor ํจ์๊ฐ ๋ค์ด์ฌ ์๋ฆฌ */);
new Promise(/* executor */ (resolve,reject) => {});
๐ง executor ํจ์๋ resolve์ reject๋ฅผ ์ธ์๋ก ๊ฐ์ง๋ค.
๐ง ์์ฑ์๋ฅผ ํตํด์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๋ง๋๋ ์๊ฐ pending( ๋๊ธฐ ) ์ํ์ ๋น ์ง๋ค.
๐ง executor ํจ์ ์ธ์์ธ resolve ํจ์๋ฅผ ์คํํ๋ฉด, fulfilled ( ์ดํ ) ์ํ๊ฐ ๋๋ค.
๐ง reject ํจ์๋ฅผ ์คํํ๋ฉด , rejected ( ๊ฑฐ๋ถ ) ์ํ๊ฐ ๋๋ค.
(์ด๋ฏธ์ง ์ถ์ฒ : ํจ์คํธ์บ ํผ์ค Javascript ์ด์
์ฌ ๊ฐ์ฌ๋)
๋น๋๊ธฐ ์ํฉ์ด ์ผ์ด๋๊ธฐ ์ ๊น์ง pending ์ํ์ ์๊ณ , ๊ทธ ์ํฉ์ด ์ ์ดํ๋๋ฉด resolve() ํจ์๋ฅผ ํธ์ถํ๊ณ ์ดํ๋์ง ์์ผ๋ฉด reject() ํจ์๋ฅผ ํธ์ถํ๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค.
const p = new Promise((resolve,reject) => {
/* pending ์ํ */
setTimeout(()=>{
resolve(); /* fullfilled ์ํ */
},1000); // 1์ด ํ์ resolve ํธ์ถ
})
// resolve ๊ฐ ํธ์ถ๋๋ฉด then ํจ์๊ฐ ์คํ์ด ๋๋ค.
p.then(()=>{
// callback
console.log('1000ms ํ์ fullfilled ๋ฉ๋๋ค.');
//์ถ๋ ฅ: '1000ms ํ์ fullfilled ๋ฉ๋๋ค.'
})
//then ์ ์ค์ ํ๋ ์์ ์ ์ ํํ ํ๊ณ , ํจ์์ ์คํ๊ณผ ๋์์ ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ๋ง๋ค๋ฉด์
//pending์ด ์์๋๋๋ก ํ๊ธฐ ์ํด ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๋ฅผ ์์ฑํ๋ฉด์ ๋ฆฌํดํ๋ ํจ์ p๋ฅผ ๋ง๋ค์ด์ค๋ค.
//ํจ์ p์ ์คํ๊ณผ ๋์์ then ์ ์ค์ ํ๋ค.
function p(){
return new Promise((resolve,reject) => {
// pending
setTimeout(() => {
resolve(); //fullfilled
},1000);
});
}
p().then(() => {
console.log('1000ms ํ์ fullfilled ๋ฉ๋๋ค.');
});
function p(){
return new Promise((resolve,reject) => {
// pending
setTimeout(() => {
reject(); //rejected
},1000);
});
}
p()
// resolve ๋์ ๋ then
.then(() => {
console.log('1000ms ํ์ fullfilled ๋ฉ๋๋ค.');
})
// reject ๋์ ๋ catch
.catch(() => {
console.log('1000ms ํ์ rejected ๋ฉ๋๋ค.');
});
// ์ถ๋ ฅ : 1000ms ํ์ rejected ๋ฉ๋๋ค.
function p(){
return new Promise((resolve,reject) => {
// pending
setTimeout(() => {
resolve('hello'); //then์ผ๋ก ์ธ์๋ฅผ ๋ณด๋
},1000);
});
}
p()
.then((message) => {
console.log('1000ms ํ์ fullfilled ๋ฉ๋๋ค.',message);
})
.catch(() => {
console.log('1000ms ํ์ rejected ๋ฉ๋๋ค.');
});
//์๋ฌ ๊ฐ์ฒด ๋ณด๋ด๊ธฐ
function p(){
return new Promise((resolve,reject) => {
// pending
setTimeout(() => {
reject(new Error('Network Error')); //then์ผ๋ก ์ธ์๋ฅผ ๋ณด๋
},1000);
});
}
p()
.then((message) => {
console.log('1000ms ํ์ fullfilled ๋ฉ๋๋ค.',message);
})
.catch((error) => {
console.log('1000ms ํ์ rejected ๋ฉ๋๋ค.', error);
});
function p(){
return new Promise((resolve,reject) => {
// pending
setTimeout(() => {
reject(new Error('Network Error')); //then์ผ๋ก ์ธ์๋ฅผ ๋ณด๋
},1000);
});
}
p()
.then((message) => {
console.log('1000ms ํ์ fullfilled ๋ฉ๋๋ค.',message);
})
.catch((error) => {
console.log('1000ms ํ์ rejected ๋ฉ๋๋ค.', error);
})
// ์ถ๊ฐ์ ์ผ๋ก ์์
ํด์ค ๊ฒ์ด ์์ผ๋ฉด ์ค์ ํด์ค๋ค.
.finally(()=>{
console.log('end');
});
function c(callback){
setTimeout(()=>{
callback();
},1000);
}
c(()=>{
console.log('1000ms ํ์ callback ํจ์๊ฐ ์คํ๋ฉ๋๋ค.');
})
// ๐ callback hell : ์ ์ ์ค์ฒฉ์ด ๋๋ค.
c(()=>{
c(()=>{
c(()=>{
console.log('1000ms ํ์ callback ํจ์๊ฐ ์คํ๋ฉ๋๋ค.');
})
})
})
// [5์ด๋์ ์ถ๋ ฅํ๊ธฐ]
function increaseAndPrint(n, callback) {
setTimeout(() => {
const increased = n + 1;
console.log(increased);
if (callback) {
callback(increased);
}
}, 1000);
}
increaseAndPrint(0, n => {
increaseAndPrint(n, n => {
increaseAndPrint(n, n => {
increaseAndPrint(n, n => {
increaseAndPrint(n, n => {
console.log('์์
๋!');
});
});
});
});
});
//์ถ๋ ฅ :
// 1
// 2
// 3
// 4
// 5
// ์์
๋!
function p(){
return new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve();
},1000);
});
}
//1์ด ๋ค
p().then(() => {
return p();
})
//2์ด ๋ค : ํ์ดํํจ์๋ผ return๊ณผ ์ค๊ดํธ ์๋ต
.then(() => p())
//3์ด ๋ค
.then(p)
//4์ด ๋ค
.then(()=>{
console.log('4000ms ํ์ fullfilled ๋ฉ๋๋ค.');
})
// ์ค์ฒฉ์ด ๋์ง์๊ณ , ์์ฐจ์ ์ผ๋ก chaining ๋๋ค. ๐๐ป
function increaseAndPrint(n) {
return new Promise((resolve, reject) => {
setTimeout(() => {
const value = n + 1;
if (value === 5) {
const error = new Error();
error.name = "ValueIsFiveError";
reject(error);
return;
}
console.log(value);
resolve(value);
}, 1000);
});
}
increaseAndPrint(0).then(increaseAndPrint)
.then(increaseAndPrint)
.then(increaseAndPrint)
.then(increaseAndPrint)
.then(increaseAndPrint)
.catch(e => {
console.log(e);
});
//์ถ๋ ฅ :
// 1
// 2
// 3
// 4
// ValueIsFiveError
Promise.resolve(/* value */);
Promise.resolve(new Promise((resolve,reject)=>{
setTimeout(()=>{
resolve('doyeon');
},1000);
})).then((data)=>{
console.log(
'ํ๋ก๋ฏธ์ค ๊ฐ์ฒด์ธ ๊ฒฝ์ฐ, resolve ๋ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ then์ด ์คํ๋๋ค.',
data
);
});
Promise.resolve('woong').then(data =>{
console.log(
'ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๊ฐ ์๋ ๊ฒฝ์ฐ, then ๋ฉ์๋๊ฐ ์๊ธฐ๋๋ฌธ์ fullfilled ๋ฉ๋๋ค.',
data
);
});
Promise.reject(/* value */);
Promise.reject(new Error('reason'))
.then(error => {})
.catch(error =>{
console.log(error);
});
function p(ms){
return new Promise((resolve,reject) => {
setTimeout(()=>{
resolve(ms);
console.log(ms,'ms ํ์ ์คํ๋ฉ๋๋ค.');
},ms);
});
}
Promise.all([p(1000), p(2000), p(3000)]).then((messages)=>{
// resolve์ ์ธ์๊ฐ ๋ฐฐ์ด ์ฒ๋ฆฌ ๋์ด then์ ์ธ์๋ก ๋ค์ด์ด (messages)
console.log('๋ชจ๋ fullfilled ๋ ์ดํ์ ์คํ๋ฉ๋๋ค.',messages)
})
์ถ๋ ฅ:
1000 ms ํ์ ์คํ๋ฉ๋๋ค.
2000 ms ํ์ ์คํ๋ฉ๋๋ค.
3000 ms ํ์ ์คํ๋ฉ๋๋ค.
๋ชจ๋ fullfilled ๋ ์ดํ์ ์คํ๋ฉ๋๋ค. [ 1000, 2000, 3000 ]
function p(ms){
return new Promise((resolve,reject) => {
setTimeout(()=>{
resolve(ms);
console.log(ms,'ms ํ์ ์คํ๋ฉ๋๋ค.');
},ms);
});
}
Promise.race([p(1000), p(2000), p(3000)]).then((messages)=>{
// ๊ฐ์ฅ ๋นจ๋ฆฌ ์คํ๋ resolve(1000)์ ์ธ์๊ฐ ๋ฐฐ์ด ์ฒ๋ฆฌ ๋์ด then์ ์ธ์๋ก ๋ค์ด์ด (messages)
console.log('๊ฐ์ฅ ๋น ๋ฅธ ํ๋๊ฐ fullfilled ๋ ์ดํ์ ์คํ๋ฉ๋๋ค.',messages)
})