Promise๋ ์ฃผ๋ก ์๋ฒ์์ ๋ฐ์์จ ๋ฐ์ดํฐ๋ฅผ ํ๋ฉด์ ํ์ํ ๋ ์ฌ์ฉํฉ๋๋ค. ํ๋ก ํธ์๋ ๊ฐ๋ฐ์๊ฐ ์๋ฒ์ API url์ ํธ์ถํด์ ๊ฒฐ๊ณผ๋ฅผ ํ๋ฉด์ ๊ตฌํํด์ผ ํ ๋ ํ์์ ์ด๊ธฐ ๋๋ฌธ์ ์ ํํ๊ฒ ์ดํดํ๊ณ ์ฐ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค.
API๊ฐ ์คํ๋์ด ์๋ฒ ๋ฐ์ดํฐ๋ฅผ ์์ฒญ์ ๋ณด๋ผ๋, ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ธฐ๋ ์ ์ ํ๋ฉด์ ๋ฐ์ดํฐ๋ฅผ ํ์ํ๋ ค๊ณ ํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ ๋น ํ๋ฉด์ด ๋น๋๋ค. ์ด์ ๊ฐ์ ๋ฌธ์ ์ ์ ํด๊ฒฐํ๊ธฐ ์ํ ๋ฐฉ๋ฒ ์ค ํ๋๊ฐ ๋น๋๊ธฐ ํต์ ์ผ๋ก ๊ฒฐ๊ณผ์ ๋ํ ์๋ต์ ํด์ฃผ๋ ๊ฐ์ฒด ํ๋ก๋ฏธ์ค์
๋๋ค.
MDN์ ๋์จ promise์ ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
The Promise object represents the eventual completion (or failure) of an asynchronous operation and its resulting value
๊ทธ๋๋ก ํด์์ ํด๋ณด์๋ฉด "promise ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด๋ก, ์์ ์ ์ต์ข ์๋ฃ(๋๋ ์คํจ)์ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋ ๋๋ค. " ์ ๋๋ค.
ํ๋ก๊ทธ๋๋ฐ์์ ๋น๋๊ธฐ(Asynchronous)๋ ์์ฒญ๊ณผ ๊ฒฐ๊ณผ๊ฐ ๋์์ ์ผ์ด๋์ง ์๋๋ค๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ์ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ํน์ ์ฝ๋์ ์ฐ์ฐ์ด ๋๋ ๋๊น์ง ์ฝ๋์ ์คํ์ ๋ฉ์ถ์ง ์๊ณ ๋ค์ ์ฝ๋๋ฅผ ๋จผ์ ์คํํ๋ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ์ ์๋ฏธํฉ๋๋ค.
promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ฅผ ๋ง์น ๋๊ธฐํ ํ๊ฒ์ฒ๋ผ ์์๋๋ก ์คํํ๊ธธ ์ํ ๋ ์ฌ์ฉํฉ๋๋ค.
Promise์ ๊ธฐ๋ณธ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค!
function ํจ์์ด๋ฆ(๋งค๊ฐ๋ณ์){
return new Promise((resolve, reject) => {
์ฑ๊ณตํ ๋ ์คํํ ๋ฌธ์ฅ(resolve)
์คํจํ ๋ ์คํํ ๋ฌธ์ฅ(reject)
}
}
ํ๋ก๋ฏธ์ค๋ฅผ ๋ฆฌํด๋ฐ์ ๊ฐ์ฒด
.then(์ ์์ ์ผ๋ก ํ๋ก๋ฏธ์ค ๊ฐ์ฒด๊ฐ ๋ฆฌํด ๋์๋ค๋ฉด ํ์ํ ์ผ์ ์ํ)
.catch(์๋ฌ๊ฐ์ฒด๊ฐ ๋ฆฌํด๋์๋ค๋ฉด ์๋ฌ๋ฅผ ์ฒ๋ฆฌ)
.finally(์ต์ข
์ ์ผ๋ก ์ฒ๋ฆฌํ ์ผ์ ์ํ)
โ resolve, reject๋ ๋งค๊ฐ๋ณ์๋ผ์ ๋ง์๋๋ก ์ด๋ฆ์ ์ค์ ํด๋ ๋์ง๋ง, ์์ ์ฑ๊ณต ๋ค๋ ์คํจ๋ก ์์๋ฅผ ์ง์ผ์ค์ผ ํฉ๋๋ค!
โ ;๋ฅผ .then().catch().fainally() ์ด ์ฌ์ด์ ์ง์ด ๋ฃ์ง ์๋๋ก ์ฃผ์ํฉ๋๋ค!
์ ์๋ง ๋ณด๋ฉด ์ดํด๊ฐ ์ด๋ ค์ฐ๋, ์๋ ์์ ์ฝ๋๋ฅผ ํตํด ์ ์ฉ ํด๋ด
์๋ค.
์ฃผ์ด์ง ์๊ฐ์ด ์ง๋๋ฉด ์ถ๋ ฅ๋๋ ํ๋ก๊ทธ๋จ์
๋๋ค.
function runInDelay(seconds){
return new Promise((resolve, reject) => {
if(!seconds || seconds < 0){
reject(new Error('second๊ฐ 0๋ณด๋ค ์์!'));
}
setTimeout(resolve, seconds*1000);
})
}
runInDelay(2)
.then(() => console.log('ํ์ด๋จธ๊ฐ ์๋ฃ๋์์ต๋๋ค'))//promise ๊ฐ์ฒด๊ฐ resolve(์ฑ๊ณต)
.catch(console.log(error)) //promise ๊ฐ์ฒด๊ฐ reject(์คํจ) ๊ฐ์ ธ์ฌ๋
.finally(()=>console.log('๋ชจ๋ ์์
์ด ๋๋ฌ์ต๋๋ค.')) //finally๋ ์ต์ข
์ ์ผ๋ก ์ฒ๋ฆฌํ ์ผ์ ์ํ
console์ฐฝ(2์ด delayํ)
ํ์ด๋จธ๊ฐ ์๋ฃ๋์์ต๋๋ค
๋ชจ๋ ์์
์ด ๋๋ฌ์ต๋๋ค.
runInDelay(2) ์คํ ํ resolve -> .then => .finallt ์์๋ก ์คํ๋๋ ๊ฒ์ ์ ์ ์์ต๋๋ค.
๋ง์ฝ runInDelay(2)์ => runInDelay()๋ก ๋ฐ๊พธ๊ฒ ๋๋ฉด ์ด๋ค๊ฒฐ๊ณผ๊ฐ ๋์ฌ๊น์?
console์ฐฝ
Error: second๊ฐ 0๋ณด๋ค ์์!
at D:\joo\JavaScript\Day8\1_promise1.js:5:20
at new Promise (<anonymous>)
at runInDelay (D:\joo\JavaScript\Day8\1_promise1.js:3:12)
at Object.<anonymous> (D:\joo\JavaScript\Day8\1_promise1.js:13:1)
at Module._compile (node:internal/modules/cjs/loader:1159:14)
at Module._extensions..js (node:internal/modules/cjs/loader:1213:10)
at Module.load (node:internal/modules/cjs/loader:1037:32)
at Module._load (node:internal/modules/cjs/loader:878:12)
at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
at node:internal/main/run_main_module:23:47
๋ชจ๋ ์์
์ด ๋๋ฌ์ต๋๋ค.
if์ ์กฐ๊ฑด๋ฌธ์ด true๊ฐ ๋๋ฉด์, reject -> .catch๋ฌธ -> .finally๋ฌธ์ ํตํด ํ๋ก๊ทธ๋จ์ด ์ข ๋ฃ๋ฉ๋๋ค.
ํ๋ก๋ฏธ์ค๋ 3๊ฐ์ง์ ์ํ๊ฐ ์กด์ฌํฉ๋๋ค.
1. Pending:
- ๋๊ธฐ์ํ๋ก, fulfilled ๋๋ rejected ์ํ๋ก ์ ํ ํ ์ ์์ต๋๋ค.
- promise๋ฅผ ์ ์ํ๋ฉด์ ์๊น๋๋ค.
2. fulfilled:
- ์ดํ์ํ๋ก, ๋ฐ๋์ง ์๋ value์ ๊ฐ๊ฒ๋๊ณ , ์ํ๋ฅผ ์ ํ์ ํด์๋ ์๋ฉ๋๋ค.
- .then์ ํตํด ๋ฆฌํด๊ฐ์ ๋ฐ์ ์ ์์ต๋๋ค.
3. rejected:
- ์คํจ์ํ๋ก, ๋ฐ๋์ง ์๋ reason์ ๊ฐ๊ฒ๋๊ณ , ์ํ๋ฅผ ์ ํ์ ํด์๋ ์๋ฉ๋๋ค.
- .catch๋ฅผ ํตํด ์คํจํ ์ด์ ๋ฅผ ๋ฐ์ ์ ์์ต๋๋ค.
์ฌ๋ฌ ๊ฐ์ ํ๋ก๋ฏธ์ค๋ฅผ ์ฐ๊ฒฐํ์ฌ ์ฌ์ฉ ํ ์ ์์ต๋๋ค.
promise.reject(): ์ง์ ๋ ์ด์ ๋ก ๊ฑฐ๋ถ๋ ์ Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํฉ๋๋ค.
promise.resolve(): ์ง์ ๋ ๊ฐ์ผ๋ก ํ์ธ๋ ์ Promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํฉ๋๋ค. .then() ์ด ์์๋ ๊ทธ ๋ค์ promise ๊ฐ์ฒด๋ฅผ ๋ฆฌํดํ๊ฒ ๋ฉ๋๋ค.
์์ ์ฝ๋๋ฅผ ํตํด ํ๋ฒ ์ดํดํด๋ด
์๋ค!
๐ => ๐ => ๐ฅ => ๐ณ์ ์์๋๋ก ๋ฆฌํดํ๋ฉฐ ์ถ๋ ฅํ๋ ์์ ์
๋๋ค.
function fetchEgg(chicken){return Promise.resolve(`${chicken} => ๐ฅ`); }
function fryEgg(egg){return Promise.resolve(`${egg} => ๐ณ`);}
function getChicken(){return Promise.resolve(`๐ => ๐`);}
getChicken()
.then((chicken) => {return fetchEgg(chicken)})
.then((egg) => fryEgg(egg))
.then((friedEgg)=>console.log(friedEgg))
.catch((error) => console.log(error.name));
//----------------------
//cosole์ฐฝ
//๐ => ๐ => ๐ฅ => ๐ณ
```
๐ => ๐
๋ ๋ค์ chicken์์ ๋ค์ด๊ฐ ๊ทธ ๋ค์๋ฌธ์ฅ fetchEgg()๊ฐ ์คํ๋ฉ๋๋ค. ๋ค์ ๐ => ๐ => ๐ฅ
๋ egg์ ๋ค์ด๊ฐ fryEgg()๊ฐ ์คํ๋๊ณ ์ต์ข
์ ์ผ๋ก ๐ => ๐ => ๐ฅ => ๐ณ๊ฐ ์ถ๋ ฅ๋๊ฒ ๋ฉ๋๋ค.function fetchEgg(chicken){return Promise.resolve(`${chicken} => ๐ฅ`); }
function fryEgg(egg){return Promise.resolve(`${egg} => ๐ณ`);}
function getChicken(){ return Promise.reject(new Error(`์นํจ์ด ๋ค ๋จ์ด์ก์!`));}
getChicken()
.then((chicken) => {return fetchEgg(chicken)})
.then((egg) => fryEgg(egg))
.then((friedEgg)=>console.log(friedEgg))
.catch((error) => console.log(error.name));
//----------------------
//cosole์ฐฝ
//Error
function fetchEgg(chicken){return Promise.resolve(`${chicken} => ๐ฅ`); }
function fryEgg(egg){return Promise.resolve(`${egg} => ๐ณ`);}
function getChicken(){ return Promise.reject(new Error(`์นํจ์ด ๋ค ๋จ์ด์ก์!`));}
etChicken()
.catch((error) => console.log(error.name));
.then((chicken) => {return fetchEgg(chicken)})
.then((egg) => fryEgg(egg))
.then((friedEgg)=>console.log(friedEgg))
//----------------------
//cosole์ฐฝ
//Error
//undefined => ๐ฅ => ๐ณ
getChicken()
.catch(() => '๐ฅ') //
.then(fetchEgg)
.then(fryEgg)
.then(console.log)
function getBanana(){
return new Promise((resolve) => {
setTimeout(()=>{
resolve('๐');
},1000);
})
}
function getApple(){
return new Promise((resolve) => {
setTimeout(()=>{
resolve('๐');
},3000);
})
}
function getOrange(){
return Promise.reject(new Error(`์ค๋ ์ง๋ ์์`))
}
์ถ์ฒ
MDN
promise-for-beginner
๋ฅ์ ์ ๊ฐ์ฌ๋ ๊ฐ์์๋ฃ
๋ญ์ด ๋ถ์ํด์..