์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ ๋น๋๊ธฐ๋ฅผ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ object
์ ํด์ง ์ฅ์๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๊ณ ๋์ ์ ์์ ์ผ๋ก ๊ธฐ๋ฅ์ด ์ํ์ด ๋์ด ์ก๋ค๋ฉด ์ฑ๊ณต์ ๋ฉ์์ง์ ํจ๊ป ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌ ํด์ค๋ค.
๋ง์ฝ ๊ธฐ๋ฅ์ ์ํํ๋ค๊ฐ ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค๋ฉด ์๋ฌ๋ฅผ ์ ๋ฌํด์ค๋ค.
1. producer
network์์ ๋ฐ์ดํฐ ๋ฐ๊ธฐ, files์์ ํฐ ๋ฐ์ดํฐ ์ฝ์ด์ค๋ ๊ณผ์ ์ ์๊ฐ์ด ๊ฑธ๋ฆผ ๊ทธ๋์ ๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌ๋ฅผ ํ๋ฉด ๊ทธ ๋ค์ ๋ผ์ธ์ ์ฝ๋๊ฐ ์คํ๋์ง ์๊ธฐ ๋๋ฌธ์ ์๊ฐ์ด ๊ฑธ๋ฆฌ๋ ์ด๋ฐ ์ผ๋ค์ promise๋ก ๋ง๋ค์ด์ ๋น๋๊ธฐ์ ์ผ๋ก ์ฒ๋ฆฌํด์ผ ํ๋ค.
์ฆ, promise object๋ฅผ ๋ง๋ค ๋ ์ฐ๋ฆฌ๊ฐ ๋น๋๊ธฐ์ ์ผ๋ก ์ํํ๊ณ ์ถ์ ๊ธฐ๋ฅ๋ค์ ์ฝ๋๋ค์ ์์ฑํ๊ณ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋ค๋ฉด resolve๋ฅผ ํธ์ถํ๊ฒ ๋๊ณ ์คํจ ํ๋ค๋ฉด ์คํจํ ๊ฒ๊ณผ ์ ์คํจํ๋์ง ์๋ฌ๋ฅผ ์ ๋ฌ ํด ์ค๋ค.
const promise = new Promise((resoleve, reject) => {
// doing some geavy word (metwork, read files)
setTimout(() => {
resolve('์๋ฏผ');
reject(new Error('no network'));
}, 2000);
});
Promise
Promise์ ์ํ ๊ฐ
2. comsumer (ํ์ ์ฒ๋ฆฌ ๋ฉ์๋)
then, catch, finally๋ฅผ ์ด์ฉํด์ ๊ฐ์ ๋ฐ์ ์ฌ ์๊ฐ ์๋ค.
์ฑ๊ณตํ ๊ฐ, ์คํจํ ์๋ฌ๋ฅผ ๋ฐ์์์ ์ฐ๋ฆฌ๊ฐ ์ํ๋ ๋ฐฉ์์ผ๋ก ์ฒ๋ฆฌ ํด ์ค๋ค.
Promise
.then(value => {
console.log(value);
})
.catch(error => {
console.log(error);
})
.finally(() => {
console.log('finally');
})
.then(์ฑ๊ณต ์, ์คํจ ์)
promise๊ฐ ์ ์์ ์ผ๋ก ์ ์ํ์ด ๋๋ค๋ฉด ๋ด๊ฐ ๊ฐ์ ๋ฐ์ ์ด -> resolve ์ฝ๋ฐฑ ํจ์๋ก ์ ๋ฌ ๋ ๊ฐ!
์ฐ๋ฆฌ๊ฐ ์ํ๋ ๊ธฐ๋ฅ์ ์ํํ๋ ์ฝ๋ฐฑํจ์๋ฅผ ์ ๋ฌ ํด ์ค
๊ฐ๋ ๋ฐ์ ์ ์์ง๋ง ๋ ๋ค๋ฅธ promise๋ ๋ฐ์ ์ ์๋ค.
.catch(์คํจ ์)
์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ๊ฒ์ธ์ง
.finally()
์ฑ๊ณต๊ณผ ์คํจ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ๋ง์ง๋ง์ ํธ์ถ๋๋ค. ๊ทธ๋์ ์ด๋ค ๊ธฐ๋ฅ์ ๋ง์ง๋ง์ผ๋ก ์ํํ๊ณ ์ถ์ ๋ ์ฌ์ฉ
3. Promise chaining
then์ ํตํด ๋น๋๊ธฐ์ ์ธ ์ฌ๋ฌ๊ฐ์ง(Promise)๋ฅผ ๋์์ ๋ฌถ์ด์ ์ฒ๋ฆฌ ํ ์ ์๋ค.
new Promise((resolve, reject) => {
setTimeout(() => resolve("promise 1"), 1000);
}).then((result) => { // ํ์ ์ฒ๋ฆฌ ๋ฉ์๋ ํ๋๋ฅผ ์ฐ๊ณ ,
console.log(result); // promise 1
return new Promise(...);
}).then((result) => { // ์ด๋ ๊ฒ ์ฐ๋ฌ์ then์ ์จ์ ์ด์ด์ฃผ๋ ๊ฑฐ์์.
console.log(result);
return new Promise(...);
}).then(...);