https://sunshineyellow.tistory.com/64
์๋ ๊ฐ์ด ๋ณผ๋งํ ๋๋ฆผ์ฝ๋ฉ ์ฝ๋ฐฑ์ง์ฅ ํ์ถ Promise ๊ธฐ์ด ๊ฒ์๊ธ.
์ ๋ก์ด ์ธ๊ฐJS์์ง ๋ณด๋ค๊ฐ ์ถ๊ฐ์ ์ธ ํค์๋ ๋ฌธ์ฅ ์ ๋ฆฌ๊ฐ ํ์ํด ์์ฑํ๋ค.
Promise๋?
์คํ์ ๋๋๋ฐ!!! ๊ฒฐ๊ณผ๊ฐ์ ๋์ค์ ์ธ ์ ์๋ค.
"์คํ์ ๋๋๋ฐ"๊ฐ ์ค์. ๊ทธ๋์ new Promise ์์ ์ต๋ช
ํจ์๋ ๋๊ธฐ์ ์ผ๋ก ์คํ์ด ๋๋ค.
๋๊ธฐ๋น๋๊ธฐ ์คํ์์ ๊ด๋ จํด์ ์๋ ์ฝ๋๊ฐ ์ค์ํ๋ค. ๊ธฐ์ตํด ๋์.
let a = 2;
const p = new Promise((resolve, reject) => {
console.log('์คํ1');
setTimeout(() => {
a = 5;
console.log('์คํ3', a);
resolve(a);
}, 0);
});
// ..๋ด์ง์ค
console.log('์คํ2');
// ..๋ด์ง์ค
p.then((result) => {
console.log('์คํ4', result);
})
// ๊ฒฐ๊ณผ :
// ์คํ1
// ์คํ2
// ์คํ3 5
// ์คํ4 5
์ ์ฝ๋์์ ์๋ new Promise ์์ ์ต๋ช ํจ์๊ฐ ๋ฐ๋ก ํธ์ถ๋ผ ๋๊ธฐ์ ์ผ๋ก ์คํ์ด ๋์ด๋ฒ๋ฆฌ๊ธฐ ๋๋ฌธ์ ์คํ1์ด ๋จผ์ ์คํ ๋๋ค.
(resolve, reject) => {
console.log('์คํ1');
setTimeout(() => {
a = 5;
console.log('์คํ3', a);
resolve(a);
}, 0);
}
๊ทธ๋ฆฌ๊ณ ๋์ ๋๊ธฐ์ ์ธ anonymus์ ์๋ ์คํ2 console.log๊ฐ ์คํ๋๊ณ ,
๊ทธ ํ ๋ฐฑ๊ทธ๋ผ์ด๋์ ๋์ด๊ฐ setTimeout(0์ด๊ฐ ์ง๋๋ฉด ์คํ)๊ณผ then(resolve๋์ด์ผ ์คํ)์ค ์กฐ๊ฑด์ ๋จผ์ ๋ง์กฑ์ํจ setTimeout ์คํ3์ด ์คํ๋๋ค.
๊ทธ ํ ๊ทธ ์์ resolve๊ฐ ๋ then ์คํ 4๊ฐ ์คํ๋๋ค.
+ ๋งคํฌ๋กํ์คํฌ์ ๋ง์ดํฌ๋กํ์คํฌ
๋งคํฌ๋กํ์คํฌ์ ๋ง์ดํฌ๋กํ์คํฌ๋ Node.js์์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ ์ค๋ช ํ๋ ์ฉ์ด๋ค. ๋์์คํ์ด ๊ฐ๋ฅํ ๋น๋๊ธฐํธ์ถ๋ค์ด ๋ค์ด๊ฐ๊ฒ ๋๋ค.
๋งคํฌ๋กํ์คํฌ(Macro Task)
์ฃผ๋ก ํ์ด๋จธ, ์ด๋ฒคํธ๋ฆฌ์ค๋, ajax ์์ฒญ ๋ฑ์ด ์ฌ๊ธฐ ๋ค์ด๊ฐ๋ค.
๋งคํฌ๋กํ์คํฌ๋ Node.js์ ์ด๋ฒคํธ ๋ฃจํ(event loop)์์ ์ฒ๋ฆฌ๋๋ฉฐ, ์ด๋ฌํ ์์
์ด ์๋ฃ๋ ๋๊น์ง ๋ฃจํ๊ฐ ๋ธ๋กํน ์ํ์ ์์ ์ ์๋ค.
๋ง์ดํฌ๋กํ์คํฌ(Micro Task)
์ฃผ๋ก promise,process.nextTick ํ๊ฐ ์ฌ๊ธฐ ๋ค์ด๊ฐ๋ค.
๋ง์ดํฌ๋กํ์คํฌ๋ ๋งคํฌ๋กํ์คํฌ๋ณด๋ค ์ฐ์ ์์๊ฐ ๋๋ค. ์ด๋ฒคํธ ๋ฃจํ์ ๋ค์ ๋จ๊ณ์ ๋จผ์ ์คํ๋๋ค.
async ๊ด๋ จ ์ฃผ์์ฌํญ
async๋ก ์ ๊ฐ์ธ๋ const result = await promise; ๋ง์ผ๋ก ๊ฐ๋ฅํ๊ฒ ๋ฐ๋์๋ค.
async๋ก ๊ฐ์ธ์ ๋ด๋ถ์์ returnํ ๊ฑด ๊ผญ ๋ฐ๋ก then์ผ๋ก ๋ฐ์์ผ ํ๋ค. ๊ทธ๋ฆฌ๊ณ async๋ก ๊ฐ์ผ await์ catch๊ฐ ์๋ผ์ try+catch๋ฅผ ๋ฐ๋ก ํด์ค์ผ ํจ.
async function main() {
try {
const result = await promise;
return result;
} catch (error) {
console.error(error);
}
}
main().then((name) => ...);
allSettled
์ด์ all ๋ง๊ณ allSettled๋ฅผ ๋ง์ด ์ด๋ค. (๋ญ๊ฐ ์คํจํ๋์ง ์ ์ ์๊ณ , ์คํจํ ๊ฒ๋ง ํํฐ๋งํด์ ๋ค์ ์๋ํ ์ ์๊ธฐ ๋๋ฌธ.)
catch
catch๋ ์์ ๋ชจ๋ ๊ฒ์ ๋ํ catch๋ค. (p๋ง ๋ณด๋ catch๊ฐ ์๋๋ผ๋ ๋ป)
p.then((result) => {
console.log('result', result);
}).then(() => {
// ์๋ฌ๋ฌ๋ค
}.then(() => {
}.then(() => {
}.then(() => {
}.catch(() => { // ์ด ์๊น์ง์ ๋ชจ๋ ๊ฒ์ ๋ํ catch
// ์๋ฌ๋ก ์ด๋
}
๊ทธ๋์ catch๋ฅผ ์ฌ์ด์ฌ์ด ๋ถ์ฌ๋ ์ข๋ค.
p.then((result) => {
console.log('result', result);
}).then(() => {
}.catch(() => { // ์ด ์๊น์ง์ ๋ชจ๋ ๊ฒ์ ๋ํ catch
}.then(() => {
}.then(() => {
}.catch(() => { // ๊ทธ์ catch ์ดํ๋ก๋ถํฐ ์๊น์ง์ ๋ชจ๋ ๊ฒ์ ๋ํ catch
}.then(() => {
}.catch(() => { // ๊ทธ์ catch ์ดํ๋ก๋ถํฐ ์๊น์ง์ ๋ชจ๋ ๊ฒ์ ๋ํ catch
}
์ถ์ฒ : ์ ๋ก์ด ์ ํ๋ธ ์ธ๊ฐJS์์ง๋๊ธฐ