November 10, 2020
๊ฐ๋ณด์. ํ๋ผ๋ฏธ์ฐ!
๋น๋๊ธฐ๋ฅผ ๊ฐํธํ๊ฒ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ Object ์ด๋ค.
์ ํด์ง ์ฅ์๊ฐ์ ๊ธฐ๋ฅ์ ์ํํ๊ณ ๋์ ์ ์์ ๊ธฐ๋ฅ์ด ์ํ๋์๋ค๋ฉด ์ฑ๊ณต ๋ฉ์์ง์ ํจ๊ป ์ฒ๋ฆฌ๋ ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌํด์ค๋ค.
๋ง์ฐฌ๊ฐ์ง๋ก ๊ธฐ๋ฅ์ ์ํํ๋ค๊ฐ ์์์น ๋ชปํ ๋ฌธ์ ๊ฐ ๋ฐ์ํ๋ค? ๊ทธ๋ฌ๋ฉด ์๋ฌ๋ฅผ ์ ๋ฌํด์ค๋ค.
์์ดํฐ 12 ์ฌ์ ์์ฝ ์ฌ์ดํธ๊ฐ ์ด๋ ธ๋ค๊ณ ํ์.
๋๋ ์ผ๋ฆฌ์ด๋ตํฐ๋ผ ์๋ก ๋์ค๋ ๊ธฐ๊ณ๋ฅผ ์ฐธ์ง ๋ชปํ๊ณ ๋ํผ ์ฌ์ดํธ์ ์ ์ํด์ ์ฌ์ ์์ฝ ๋ฑ๋ก ๋ฒํผ์ ๋๋ฌ ๋ฒ๋ ธ๋ค.
์ง๊ธ ๋น์ฅ ์์ดํฐ 12๋ฅผ ์์ ์ฅ์ง ๋ชปํ์ง๋ง ์ถํ ์ ์ ํ๋งค๊ฐ ๊ฐ์๋ ๋ ๋ด ๋ฉ์ผ๋ก ๋ฐ๋ก ๊ณต์ง๋ฅผ ๋ฐ๊ฒ ๋ ๊ฒ์ด๊ณ ๊ตฌ๋งค๋ฅผ ํ ์ ์๊ฒ ๋๋ค.
๊ทธ๋ฆฌ๊ณ ๋๊ตฐ๊ฐ๋ ์ ์ ํ๋งค๊ฐ ์์๋๊ณ ์ ํด๋น ์ฌ์ดํธ์ ๋ฑ๋ก๋ฒํผ์ ๋๋ ์ ์๋ ์๋ค.
๊ทธ๋๋ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ฉ์ผ๋ก ๊ณต์ง๋ฅผ ๋ฐ๊ฒ ๋๊ณ ๊ตฌ๋งค๊ฐ ๊ฐ๋ฅํด ์ง ๊ฒ์ด๋ค.
์ด๋ฌํ ์ฒ๋ฆฌ๋ฅผ (๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฐฉ์) callback ์ ์ฐ์ง ์๊ณ ! ํ๋ ๋ฐฉ์์ด๋ค.
Promise (ํ๋ผ๋ฏธ์ค) ๋ ๋น๋๊ธฐ์ ์ธ ๊ฒ์ ์ํํ ๋ ์ฝ๋ฐฑ ํจ์ ๋์ ์ ์ ์ฉํ๊ฒ ์ธ ์ ์๋ ์ค๋ธ์ ํธ ์ด๋ค.
Process ๊ฐ heavy ํ operation ์ ์ํํ๋ ์ค์ธ์ง (pending),
์๋๋ฉด ๊ธฐ๋ฅ ์ํ์ด ์๋ฃ๋์ด์ ์ฑ๊ณตํ๋์ง (fulfilled),
๊ธฐ๋ฅ ์ํ์ ์๋ฃ๋์๊ธด ํ๋๋ฐ ์คํจํ๋์ง (rejected) ์ ๋ํ ์ํ.
์ํ ์์ฝ.
ํ๋ผ๋ฏธ์ค๋ก ๋ฐ์ดํฐ๋ฅผ ์ ๊ณตํ๋ ์ญํ ์ ๋ง๋ค๋ฉด ๋ญํ๋ (Producer), ๊ฐ๋ค ์จ๋จน์ด์ผ ๋ฝ๋๊ฒ์ง (Consumer)..
Promise ์ธ์คํด์ค ๊ฐ์ฒด๋ฅผ ์ ์ธํด ๋ณด์.
const promise = new Promise((resolve, reject) => {
// doing some heavy work
})
new ํค์๋๋ฅผ ๋ถ์ฌ promise ์ธ์คํด์ค๋ฅผ ๋ง๋๋๋ฐ Promise ์ ์ธ์๋ก executor ๋ผ๋ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ ๋ฌํด ์ค์ผ ํ๋ค.
๊ทธ๋ฐ๋ฐ ์์ ๋ชจ์์ ๋ด์ ์๋ค์ํผ, ์ด executor ์ฝ๋ฐฑ ํจ์์๋ ๋ ๋ค๋ฅธ 2๊ฐ์ง์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค.
๊ทธ๊ฒ์ ๋ฐ๋ก resolve ์ reject ํค์๋ ์ด๋ค.
์ ์จ? ๋ผ๊ณ ํ๋ค๋ฉด..?
์.. ๋คํธ์ํฌ ํต์ ์์ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์ค๊ฑฐ๋, ๋์ฉ๋ ํ์ผ์ ๋ด์ฉ์ ์ฝ์ด์ฌ ๋ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆฌ๋ฆฌ๋ผ๋ ๊ฒ์ ์ผ์ฒ ๋์๋ ์ง์ํ ์ ์๋ค.
๊ทธ๋ฆฌํ์ฌ ์ด๋ฌํ ์๊ฐ์ด ์ค๋ ๊ฑธ๋ฆด๋ฒํ task ๋ค์ ๋๊ธฐ์ (synchronous) ์ผ๋ก ์ฒ๋ฆฌํ๋ฉด ์ด๋ป๊ฒ ๋ ๊น?
์๋ง ๋ฐ์ดํฐ๋ฅผ ๋ฐ๋ ๋์ ๊ทธ ๋ค์ ๋ผ์ธ์ ์ฝ๋๊ฐ ์คํ๋์ง ์์ ๊ฒ์ด๋ค.
const promise = new Promise((resolve, reject) => {
// doing some heavy work
console.log('come on you spurs');
})
come on you spurs
promise ๋ฅผ ๋ง๋๋ ์๊ฐ, ์ ๋ฌํ executor ๋ผ๋ ์ฝ๋ฐฑํจ์๊ฐ ๋ฐ๋ก ์คํ๋๋ ๊ฒ์ ํ์ธํ ์ ์๋ค.
๊ทธ๋ฐ๋ฐ ์ฌ๊ธฐ์ ์ค์ํ ์ ์ด ์๋ค.
๋ง์ฝ ๋คํธ์ํฌ ์์ฒญ์ ์ฌ์ฉ์๊ฐ ์๊ตฌํ์ ๋๋ง ํด์ผ ํ๋ ๊ฒฝ์ฐ๋ผ๋ฉด (๊ฐ๋ น ๋ฒํผ์ ํด๋ฆญํ์ ๋๋ง),
์์ฒ๋ผ ์์ฑํ๋ฉด ๋ถํ์ํ ๋คํธ์ํฌ ํต์ ์ด ์ผ์ด๋ ์ ์๋ค.
ํ๋ ์ด์ ์ ๊ฐ๊ณผํ๋ค๊ฐ ๋ถํ์ํ ๋คํฌ์ํฌ ํต์ ์ ํ ์ ์๋ค๋ ์ ์ ์๊ณ ๋์ด๊ฐ์.
When new Promise is created,
the executor runs automatically.
์ด์ promise ์์์ ๋ง์น ๋คํธ์ํฌ ํต์ ์ ํ๋ ๊ฒ์ฒ๋ผ, setTimeout ์ ์ด์ฉํด์ ์๊ฐ์ ๋๋ ์ด๋ฅผ ์ค๋ณด์,.
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve('seolleung2.dev')
}, 2000)
})
resolve ๋ฅผ ์ผ๋ค๋ ์๋ฏธ๋ ์ฑ๊ณต์ ์ผ๋ก ๋คํธ์ํฌ, ํน์ ํ์ผ์์ ์ฝ์ด์จ (๋ฐ์์จ) ๊ฒ๋ค์ ๊ฐ๊ณตํ ๋ฐ์ดํฐ๋ฅผ resolve ๋ผ๋ ์ฝ๋ฐฑํจ์๋ฅผ ํตํด ์ ๋ฌํ๋ค ๋ผ๋ ์๋ฏธ์ด๋ค.
์ด๋ค ๊ธฐ๋ฅ์ ์ฑ๊ณต์ ์ผ๋ก ์ํํ์ ๋, resolve ๋ผ๋ ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๋ค.
๊ทธ๋ฆฌ๊ณ ๊ทธ ๋ ๋ฐ์ดํฐ๋ฅผ ๋ฐ์์จ ์ฌ์ฉ์์ ์ด๋ฆ์ โseolleung2.devโ ์ด๋ค.
๋ค์,
์ด๋ค ์ผ์ 2์ด ์ ๋ ๋ฌด์ธ๊ฐ๋ฅผ ํ๋ค๊ฐ ๊ฒฐ๊ตญ์๋ ์ผ์ ์ ๋ง๋ฌด๋ฆฌ ํด์ resolve ๋ผ๋ ์ฝ๋ฐฑํจ์๋ฅผ ํธ์ถํ๋ฉด์ โseolleung2.devโ ๋ผ๋ ๊ฐ์ ์ ๋ฌํด์ฃผ๋ promise ๋ฅผ ๋ง๋ค์๋ค.
๊ทธ๋ผ ์ด์ ๋ง๋ Producer ๋ฅผ ์จ๋จน์ด ๋ณด๋ Consumer ๋ฅผ ์ ์ฉํด ๋ณด์.
์ด์ ์์ ๋ง๋ promise ์๋ค ์ํ๋ ๊ธฐ๋ฅ์ ํ๋ callback ํจ์๋ฅผ ์ ๋ฌํด์ฃผ์.
promise.then((value) => {
console.log(value);
})
seolleung2.dev
Promise {<fulfilled>: undefined}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined
์์ Producer ์ resolve ์ธ์๋ก ํ์ด โseolleung2.devโ ๊ฐ then ์ ์ฝ๋ฐฑ ํจ์ ๋ด value ๋ก ๊ฐ์ ๋ฐ๊ฒ ๋๋ฉด์,
์ฆ Promise ๊ฐ ์ ์์ ์ผ๋ก ์ ์ํ์ด ๋์ด์ ๋ง์ง๋ง์ ์ต์ข ์ ์ผ๋ก resolve ์ฝ๋ฐฑํจ์๋ฅผ ํตํด โseolleung2.devโ ๋ผ๋ ๊ฐ์ด value ๋ก ๋ค์ด์จ๋ค.
์.. ์ ์์ ์ผ๋ก ์ํ๋์์ ๋ resolve..
๊ทธ๋ผ resolve ๋ง๊ณ reject ๋ฅผ ์ฐ๋ฉด ์ด๋ป๊ฒ ๋๋?
Consumer ์ ๋๋ฒ์งธ ํค์๋๋ฅผ ๋ธ๋ก๊น ํ๋ ค๋ ๋ฐ๋ฐฅ์ด๋ค.
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error('No Network'))
}, 2000)
})
reject ๋ผ๋ ํค์๋๋ก ๋ฐ๊พธ์๊ณ ๊ทธ ์ธ์๋ก๋ new Error ๋ผ๊ณ ํด์ ์๋ฐ์คํฌ๋ฆฝํธ์์ ์ ๊ณตํ๋ ์๋ฌ object ๋ฅผ ๋ฃ์๋ค.
๋์ค ์ธ ์ผ์ด ์์ ๋ ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ช ํํ๊ฒ ์ ๋ฌํด์ผ ํ๋ค๊ณ ํ๋ค.
๊ทธ๋ฆฌ๊ณ ์ฝ์๋ก ์ฎ๊ฒจ ์คํํด ๋ณด๋๊น Uncaught Error ์ฆ ์กํ์ง ์์ ์๋ฌ๊ฐ ๋ฌ๋ค.
์?
์๊น then ์ด๋ผ๋ ํค์๋๋ฅผ ์จ์ ์ฑ๊ณต์ ์ผ๋ก ์ํ๋์์ ๋์ ์ผ์ด์ค๋ง ๋ค๋ฃจ์ด ๋ณด์๊ธฐ ๋๋ฌธ์ด๋ค.
์ด์ ์๋ฌ ํธ๋ค๋ง์ ์ํ ํค์๋๋ฅผ ์ตํ ์ฐจ๋ก๋ค.
.catch ๋ฅผ ํตํด ๊ทธ ๋ด๋ถ ์ธ์๋ก error ๋ก ์๋ฌ ๋ฉ์์ง๋ฅผ ๋ฐ์ ์๋ฌ๊ฐ ๋ฐ์ํ์ ๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํด์ค ๊ฒ์ธ์ง์ ๋ํ ์ฝ๋ฐฑํจ์๋ฅผ ์ค์ด ๋ณด๋๋ค.
promise //
.then((value) => {
console.log(value);
})
.catch((error) => {
console.log(error);
})
Error: No Network
at <anonymous>:3:12
Promise {<fulfilled>: undefined}
__proto__: Promise
[[PromiseState]]: "fulfilled"
[[PromiseResult]]: undefined
์ด์ ๋ ์ด์ ๋นจ๊ฐ ์๋ฌ๋ฅผ ๋ณด์ด์ง ์๊ณ ์๋ฌ ๋ฉ์์ง๋ฅผ ์ถ๋ ฅํ๋ ๊ฒ์ ๋ณผ ์ ์๋ค.
์ด ํค์๋๊ฐ ์๋ค๋ ๊ฑธ ์๊ฒ ๋๋ฉด์ ๋ธ๋ก๊น ํ ๋ ์ด ์งค์ ๊ผญ ์ฐ๊ณ ์ถ์๋ค.
์ฌ๊ธฐ๊น์ง๋ง ํ์โฆ
promise //
.then(value => {
console.log(value)
})
.catch(error => {
console.log(error)
})
.finally(() => {
console.log('ํ์ด๋์๋ฆฌ~')
})
์ผ์ ์ํ ์ฑ๊ณต, ์คํจ์ ์๊ด ์์ด ๋ฌด์กฐ๊ฑด ๋ง์ง๋ง์ ํธ์ถ๋์ด์ง๋ ์์ด์ด๋ค.
์ด๋ค ๊ธฐ๋ฅ์ ๋ง์ง๋ง์ ์ํํ๊ณ ์ถ์ ๋ ์ฌ์ฉํ๋ค.
ํ๋ก๋ฏธ์ค ์ฒด์ด๋์ ๋ค์ ๋ธ๋ก๊น ์ ์๊ฐํด ๋ณด๊ฒ ๋ค.