promise, async await์ ์คํ ์์๋ฅผ ์ดํดํ๊ณ ์ ์์ฑํ์๋ค.
async function start(n) {
console.log('hi');
const prom = new Promise((resolve) => {
console.log(n);
resolve('prom');
});
const prom2 = new Promise((resolve) => {
console.log(n);
resolve('prom2');
});
let a = await prom;
let b = await prom2;
console.log('end');
return a + b;
}
start(1).then(console.log);
console.log('after');
hi 1 after 1 end promprom2
ํ์ง๋ง, ์ฒ์ ๋์ ์์์ ๋ค์๊ณผ ๊ฐ์๋ค.
hi
1
1
end
after
promprom2
๊ฐ์ฅ ๋ง์ง๋ง console.log('after')์ด ์คํ๋๊ธฐ ์ , startํจ์์ ๋จ์์๋ ์คํ์ ๋ง์ ์งํํ ๊ฒ์ด๋ผ๊ณ ์์ํ๊ณ , async์ console.log('end')๊ฐ ์คํ๋ ๊ฒ์ด๋ผ๊ณ ์์ํ์๋ค.
ํ์ง๋ง, await๋ฅผ ๋ง๋๋ ์๊ฐ startํจ์๋ ๋ฉ์ท๋ค.
๋ด๊ฐ ๋์น๊ณ ์์๋ ๋ถ๋ถ์ ๋ญ๊น??
๋ด๊ฐ ๊ณ ๋ฏผํ๋ ๋ถ๋ถ์ ์์ํ๊ฒ ์ค๋ช ํด ๋์ ๋ธ๋ก๊ทธ๋ฅผ ๋ฐ๊ฒฌํ๋ค.
๋น๋๊ธฐ ์คํ ํ๋ฆ ์ดํดํ๊ธฐ (async/await)
๋น๋๊ธฐ ์คํ async/await ์ค๋ช
์๋ณธ(์์ด)
์ ๋ฆฌ๋ฅผ ํ์๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
start(1) ํธ์ถ
console.log('hi') ์คํ, ์ถ๋ ฅ //-> hi ์ถ๋ ฅ
prom() ํธ์ถ
console.log(n) ์คํ, ์ถ๋ ฅ //-> 1 ์ถ๋ ฅ
Prom() Promise ๋ฆฌํด
await๋ฅผ ๋ง๋ฌ๊ธฐ ๋๋ฌธ์, start(1)์ ์ผ์์ค๋จ๋๊ณ , MicroTake Queue๋ก ์ด๋์ํด.
asyncํจ์์์ ๋์์, asyncํจ์๋ฅผ ํธ์ถํ ์คํ ์ปจํ ์คํธ๋ก ๋์๊ฐ์ ๋ง์ ์คํ. ์์ ์์์์๋ ์ ์ญ ์ปจํ ์คํธ๋ก ๋์๊ฐ.
console.log('after') ์คํ, ์ถ๋ ฅ //-> after ์ถ๋ ฅ
์คํ ์ปจํ ์คํธ์ task๊ฐ ๋ ์ด์ ์๋ ๊ฒ์ ํ์ธํ๊ณ ์ด๋ฒคํธ๋ฃจํ๊ฐ MicroTask Queue๋ฅผ ํ์ธ
async ํจ์์ธ startํจ์๊ฐ ์ฝ์คํ์ผ๋ก ์ฎ๊ฒจ์ง๊ณ , ์ด์ ์ ์ค๋จ๋ ๊ณณ์์ ์ด์ด์ ์คํ
์์ ๊ณผ์ ์ ๋ฐ๋ณต
start์ Promise ๋ฆฌํด๊ฐ์ ๋ฐ์ then์คํ
์ด๋ฒ ์์์ฝ๋๋ฅผ ํตํด ์๊ฒ๋ ์ฌ์ค์ await๋ฅผ ๋ง๋๋ฉด asyncํจ์๋ ์ค๋จ๋๊ณ MicroTask Queue๋ก ์ด๋์ํจ๋ค๋ ๊ฒ์ด๋ค.
MicroTask Queue๋ก ์ด๋ํ ํ์ call stack์ด ๋น๋ฉด, MicroTask queue๋ ํ๋์ฉ call stack์ผ๋ก ์ด๋์์ผ ๋ค์ ์คํ์ํจ๋ค.
๋๋ฌธ์ ๋์ ์์๊ณผ๋ ๋ค๋ฅธ ๊ฐ์ด ์ถ๋ ฅ๋ ๊ฒ์ด์๋ค.
์๋ ๋ธ๋ก๊ทธ๋ ๋น๋๊ธฐ, ์ด๋ฒคํธ ๋ฃจํ๋ฅผ ์ดํดํ๋๋ฐ ์ ๋ง ์ ๋ง ์ ๋ง ์ข์ ์๋ฃ์ด๋ค!