์ฌ ๊ฒ์ด ์๋ค. JS๋ฅผ ๊ณต๋ถํ๋ฉด์ ์ด๋ ค์ด ์ดํดํ๊ธฐ ์ด๋ ค์ด ๋ด์ฉ๋ค์ด ๋ง์ด ๋์ค๋๋ฐ ๋น๋๊ธฐ๋ ๊ทธ ์ค ํ๋์ด๋ค. ์ฌ์ค ๊ฐ๋ ์์ฒด๋ ์ด๋ ต์ง ์์๋ฐ ์ฝ๋ ์์ฑ ๋ฐฉ์๊ณผ ์ฒ๋ฆฌ ๋๋ ๋ฉ์ปค๋์ฆ ์ดํด๊ฐ ์ฝ์ง๋ ์๋ค. ์ผ๋จ ๋ง์ด ์ฌ์ฉํด๋ณด๊ณ ์ต์ํด์ ธ์ผ ํ ๋ฏ ์ถ๋ค.
๋น๋๊ธฐ ์ฒ๋ฆฌ ํ ๋ ๊ฐ์ฅ ๋ง์ด ์ฐ๋ ๊ฒ์ด Promise ๊ฐ์ฒด์ด๋ค.
์ด๋ฆ์์ ์ ์ ์๋ฏ์ด ์ฝ๋์ ์คํ์์๋ฅผ ์ฝ์ํด์ค๋ค.
๋น๋๊ธฐ ์์ ์ด ๋ง์ดํ ๋ฏธ๋์ ์๋ฃ ๋๋ ์คํจ์ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋ ๋๋ค. - MDN
MDN์์์ Promise ์ ์์ธ๋ฐ, ์ญ์๋ ์ฒ์ ๋ณด๊ณ ํ๋ฒ์ ์ดํด๋์ง ์๋๋ค.
๊ฒฝํ์ ๋น๋๊ธฐ๋ ์์ ์ฝ๋๋ฅผ ๋ฏ์ด๋ณด์์ผ ๊ทธ๋๋ง ์ดํด๊ฐ ์๋๋ค.
function a() {
return new Promise((resolve) => {
// resolve๊ฐ ์คํ์ด ๋๋ ์์น๊ฐ ๊ธฐ๋ค๋ฆผ์ด ์ข
๋ฃ๋๋ ์์น
setTimeout(() => {
console.log('A')
resolve()
}, 1000)
})
}
์ ์ฝ๋๋ a() ํจ์๋ฅผ ์ ์ ํ ๊ฒ์ด๊ณ return์ผ๋ก Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค. Promise ๊ฐ์ฒด๋ฅผ ์์ฑํ ๋๋ ๋ ๊ฐ์ ์ธ์๋ฅผ ๋ฃ์ ์ ์๋๋ฐ, ์ฒซ ๋ฒ์งธ ์ธ์๋ resolve์ด๋ค.
์ฌ๊ธฐ์ ์ ๊น, ๋น๋๊ธฐ๋ฅผ ์ ์ฐ๋์ง ๋ชฉ์ ์ ๋ถ๋ช
ํ ์๊ฐํ๊ณ ๊ทธ๊ฒ์ ๋๊น์ง ๋๊ณ ๊ฐ์ผํ๋ค.
๋น๋๊ธฐ๋ ์ฝ๋์ ์์๋ฅผ ๋ณด์ฅํ๊ธฐ ์ํ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ๋ณด์๋ฉด, a() ํจ์๋ฅผ ์ถ๋ ฅํ ๊ฒฝ์ฐ setTimeout() ํจ์๋ฅผ ํตํด 1์ด ๋ค์ 'A'๊ฐ ์ถ๋ ฅ๋ ๊ฒ์ด๋ค.
์ฌ๊ธฐ์ resolve๋ console.log('A')๊ฐ ์ถ๋ ฅ ๋ ์ดํ์ ์คํ๋๋ค.
'A'๊ฐ ์ถ๋ ฅ๋๊ณ ๋์ resolve ์ฝ๋๊ฐ ์คํ๋๋๋ก ๋ณด์ฅํด์ฃผ๋ ๊ฒ์ด๋ค.
function test() {
const promise = a()
promise.then(() => {
console.log('B')
})
}
์ ์ฝ๋๋ฅผ ๋ณด๋ฉด, test() ํจ์๋ฅผ ์คํํ ๊ฒฝ์ฐ a() ํจ์๋ promise ๊ฐ์ฒด๋ฅผ ๋ฐํํด promise ๋ณ์์ ๋ด๊ณ promise ๊ฐ์ฒด๋ ๋ค์ .then() ๋ฉ์๋๋ฅผ ์ธ ์ ์๋๋ฐ ์ด๊ฒ์ด resolve()๊ฐ ์คํ๋๋ ์์น์ ๊ฐ๋ค.
์ฆ, a() ํจ์์ resolve ์์น์ ์ฝ๋๋ฅผ .then ๋ฉ์๋๋ก ์คํ ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ด๋ค.
์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ๊ฐ๋จํ ์ ๋ฆฌํ๋ฉด
// ๋ฉ์๋ ์ฒด์ด๋์ผ๋ก ๊ฐ๋จํ ํํ
function test() {
a().then(() => {
console.log('B')
})
}
a() ํจ์๋ promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ฏ๋ก ๋ฐ๋ก .then()์ ์ด์ด ๋ถ์ผ ์ ์๋ค.
ECMA 2015 ์ดํ์ ๋์จ async await๋ก ํํํ์๋ฉด
async function test() {
await a()
console.log('B')
}
test() // A ๋์ค๊ณ B
์ด๋ ๊ฒ ํํํ ์ ์๋ค. ์กฐ๊ธ ๋ ๊ฐ๋จํ๊ฒ ์ฝ๋๋ฅผ ์์ฑํ ์ ์๋ค.
๊ทธ๋ ๋ค๋ฉด ๋น๋๊ธฐ ์ฒ๋ฆฌ์ธ Promise ๊ฐ์ฒด์ async await๋ ์ธ์ ์ฐ์ด๋๊ฐ?
์์์ ์ค๋ช ํ๋ฏ์ด ๋ชฉ์ ์ ์ฝ๋์ ์คํ์์ ๋ณด์ฅ์ด๋ค.
์คํ์์๋ฅผ ๋ณด์ฅํ๋ ๊ฒ์ ์ฝ๋ฐฑ์ผ๋ก๋ ๊ฐ๋ฅํ๊ธด ํ๋ฐ,
๊ณ์๋ ์ฝ๋ฐฑ์ ์ฝ๋์ ๊ฐ๋
์ฑ์ ๋จ์ด๋จ๋ฆฌ๊ณ ์ฑ๋ฅ์ ํ ๋ฐ ๋ฆฌํฉํ ๋ง์ด ์ด๋ ต๋ค.
๊ทธ๊ฒ์ ์ฝ๊ฒ ๋ง๋ค๊ธฐ ์ํด Promise๋ฅผ ์ฐ๊ณ ๋ ์ต๊ทผ ํํ์ ๋น๋๊ธฐ ๋ฐฉ์์ธ ascyn awiat๋ฅผ ์ฐ๋ ๊ฒ์ด๋ค.
์ด๋ค๊ฑธ ์ฐ๊ธฐ์ ์์ '๊ทธ๋ฅ ์ฐ๋๊น ์ฐ์ง ๋ญ~' ๋ผ๊ณ ์๊ฐํ๊ธฐ ๋ณด๋ค๋ ๋ชฉ์ ๊ณผ ์ ์ฐ์ด๋์ง๋ฅผ ๋ถ๋ช ํ ์์์ผ ๋ ๋์ ์ฝ๋๋ฅผ ์์ฑํ ์ ์์ ๊ฒ์ด๋ค.
function a() {
return new Promise((resolve) => {
// resolve๊ฐ ์คํ์ด ๋๋ ์์น๊ฐ ๊ธฐ๋ค๋ฆผ์ด ์ข
๋ฃ๋๋ ์์น
setTimeout(() => {
console.log('A')
resolve()
}, 1000)
})
}
function b() {
return new Promise((resolve) => {
// resolve๊ฐ ์คํ์ด ๋๋ ์์น๊ฐ ๊ธฐ๋ค๋ฆผ์ด ์ข
๋ฃ๋๋ ์์น
setTimeout(() => {
console.log('B')
resolve()
}, 1000)
})
}
function c() {
return new Promise((resolve) => {
// resolve๊ฐ ์คํ์ด ๋๋ ์์น๊ฐ ๊ธฐ๋ค๋ฆผ์ด ์ข
๋ฃ๋๋ ์์น
setTimeout(() => {
console.log('C')
resolve()
}, 1000)
})
}
function d() {
return new Promise((resolve) => {
// resolve๊ฐ ์คํ์ด ๋๋ ์์น๊ฐ ๊ธฐ๋ค๋ฆผ์ด ์ข
๋ฃ๋๋ ์์น
setTimeout(() => {
console.log('D')
resolve()
}, 1000)
})
}
function test() {
a()
.then(() => {
return b() // b() ํจ์๋ ์คํด๋๋ฉด promise ๊ฐ์ฒด๊ฐ ๋์ค๊ณ ๊ทธ๊ฒ์ ๋ฐํํ์ฌ ์ฒด์ด๋ ํํ๋ก ์์ฑ๊ฐ๋ฅ
})
.then(() => {
return c()
})
.then(() => {
return d()
})
.then(() => {
console.log('Done!')
})
}
test() ํจ์๋ฅผ ์ถ๋ ฅํจ์ผ๋ก์จ a, b, c, d ํจ์๋ฅผ ์ฐจ๋ก๋๋ก ์ถ๋ ฅํ๋ ์ฝ๋์ด๋ค.
๊ฐ๊ฐ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋๋ก ํ๊ธฐ ๋๋ฌธ์ ๋ฐ๋ก ์ฒด์ด๋ ํํ๋ก .then()์ ํ์ฉํ ๋ชจ์ต์ด๋ค.
ํ์ดํ ํจ์ ๋ค๊ฐ ์ฝ๋ ํ ์ค ์ด๋ฏ๋ก ๋ ๊ฐ๋จํ ํํํ์๋ฉด
function test() {
a()
.then(() => b())
.then(() => c())
.then(() => d())
.then(() => console.log('Done!'))
} // a, b, c, d ํจ์ ์์๋๋ก ์ถ๋ ฅ๋จ
Promise ๊ฐ์ฒด๋ 3๊ฐ์ง ํํ๋ก ์ฝ๋๋ฅผ ์ฒ๋ฆฌํ ์ ์๋ค.
.then()์ ์ ์์์์ ๋ดค๋ฏ์ด resolve๋ฅผ ์คํํ๋ ์์น์ ๋๊ฐ์ด .then()์ ํตํด ์คํํ๊ฒ ํ๋ ๊ฒ์ด๋ค.
.catch()
๋ฐ๋ก ์์๋ถํฐ ๋ณด์๋ฉด
// .catch()
function a(number) {
return new Promise((resolve, reject) => {
// ์ ์์ ์ผ๋ก ์คํ๋์ง ๋ชปํ ๋ reject๊ฐ ๋ฐํ๋จ
if (number > 4) {
reject()
}
// resolve๊ฐ ์คํ์ด ๋๋ ์์น๊ฐ ๊ธฐ๋ค๋ฆผ์ด ์ข
๋ฃ๋๋ ์์น
setTimeout(() => {
console.log('A')
resolve()
}, 1000)
})
}
a(5) // ์กฐ๊ฑด๋ฌธ์ ๊ฑธ๋ ค reject()๊ฐ ์ถ๋ ฅ๋๋ค.
์์์ Promise ๊ฐ์ฒด๋ ๋ ๊ฐ์ง ์ธ์๋ฅผ ๋ฐ๋๋ค๊ณ ํ๋๋ฐ,
์ฝ๋๊ฐ ์ ๋๋ก ์คํ ๋ ๊ฒฝ์ฐ resolve๋ฅผ ์ถ๋ ฅํ๊ณ ์ ๋๋ก ์คํ๋์ง ๋ชปํ๋ค๋ฉด reject๋ฅผ ์ถ๋ ฅํ๊ฒ ํ์ฌ ์์ธ์ฒ๋ฆฌ๋ฅผ ํ ์ ์๋ค. ์ ์ฝ๋์ ๊ฐ์ด ํน์ ์กฐ๊ฑด์ ๋ฐ๋ผ ํธ์ถ๋๊ฒ ํ ์ ์๋ค.
function test() {
a()
.then(() => {
// .then()์ resolve()๊ฐ ์คํ๋๋ ์์น์ ๋์ผ ์ฆ, ํน์ ์์ ์ ์คํ ์ํค๋ ๊ฒ์ ๋ณด์ฅ
console.log('Resolve')
})
.catch(() => {
// .catch()๋ reject()๊ฐ ์คํ๋๋ ์์น์ ๋์ผ ์ฆ, ํน์ ์์ ์ ์คํ ์ํค๋ ๊ฒ์ ๋ณด์ฅ
console.log('Recject')
})
.finally(() => {
console.log('Done') // .then์ด๋ ํน์ .catch ์คํ๋๊ณ ๋์ ๋ง์ง๋ง์ผ๋ก ์คํ๋จ.
})
}
์ด๋ ๊ฒ Promise์ ์ธ๊ฐ์ง ์ํ๋
์๋ฌ๊ฐ ๋ฌ์ ๊ฒฝ์ฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด ์ฌ์ฉํ๋ค.
Promise๋ ๋ญ ์๊ฒ ๊ณ .. ๊ทธ๋ผ async await๋ ๋ญ๋ฐ?!
์ฌ์ค Promise๊ฐ ์ฝ๋์ ์์๋ฅผ ๋ณด์ฅํด์ฃผ๊ณ ์ฝ๋ฐฑ์ง์ฅ์ ํด๊ฒฐํ๊ธฐ ์ํด ๋์์ง๋ง,
์ฐ๋ค๋ณด๋ฉด Promise ๋ํ ์ฝ๋ฐฑ ์ง์ฅ์ ์ฝ๋ ํํ๊ฐ ๋ํ๋๊ธฐ๋ ํ๋ค.
// Promise์์ ๋ํ๋๋ ์ฝ๋ฐฑ์ง์ฅ์ ๋ชจ์ต
function test() {
a().then(() => {
b().then(() => {
c.then(() => {
d.then(() => {
console.log('Done!')
})
})
})
})
}
๋ฐ๋ผ์ ๋ ๊ฐ๋จํ๊ณ ์ฝ๊ฒ ์ฝ๋ฐฑ์ง์ฅ์ ํผํ๊ณ ๋น๋๊ธฐ ์ฒ๋ฆฌํ๊ธฐ ์ํด async await๊ฐ ๋์๋ค๊ณ ์๊ฐํ๋ฉด ๋๋ค!
์์๋ถํฐ ๋ณด์.
function a() {
return new Promise((resolve, reject) => {
if(number > 4) {
reject()
return
}
setTimeout(() => {
console.log('A')
resolve()
}, 1000)
})
}
async function test() {
await a()
b()
}
์ด๋ ๊ฒ ์ฒ๋ฆฌํ๋ฉด aํจ์๊ฐ ์ถ๋ ฅ๋๊ธฐ๋ฅผ ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์ฝ๋์ธ bํจ์๊ฐ ์ถ๋ ฅ๋๋ค.
Priomise์ resolve, reject, finally์ ๋ง์ฐฌ๊ฐ์ง๋ก awync await ๊ตฌ์กฐ์์๋ ์์ธ์ฒ๋ฆฌ๊ฐ ๊ฐ๋ฅํ๋ค.
// ์๋ฌ
function test() {
await a(5)
console.log('Resolve!') // ์กฐ๊ฑด์ ์ํด reject๊ฐ ์คํ๋๋ฏ๋ก a() ํจ์ ๋ค์ ๋ด์ฉ์ ์คํํ ์ ์์(์๋ฌ ๋ธ)
}
// ํด๊ฒฐ
function test() {
try {
await a(5)
console.log('Resolve!')
} catch(error) {
console.log('Reject!')
} finally {
console.log('Done')
}
}
test() // ์กฐ๊ฑด์ ์ํด catch ๊ตฌ๋ฌธ์ด ์ถ๋ ฅ๋จ
try catch ๊ตฌ๋ฌธ์ ํตํด ์ฝ๋๊ฐ ์ ์คํ๋๋ค๋ฉด try ๊ตฌ๋ฌธ ํจ์๊ฐ ์งํ๋๊ณ ์๋ฌ๋ ์์ธ์ฌํญ์ด ์๊ธด๋ค๋ฉด catch ๊ตฌ๋ฌธ์ด ์คํ๋๋ค.
ํ์ด์ฌ์ try๋ฌธ์ด๋ ๊ฐ์ ๊ธฐ๋ฅ์ด๋ค.
ํ์คํ Promise ์ดํ์ ๋์จ async awiat ๊ตฌ์กฐ๊ฐ ๋ ๊ฐ๊ฒฐํ๊ณ ๊ฐ๋ ์ฑ์ด ์ข์ ๋ชจ์ต์.
์ด๋ก ์ ์ผ๋ก ์๋ ๊ฒ๊ณผ ์ค์ ์ฝ๋๋ฅผ ์จ์ ํ์ฉํ๋ ๊ฒ์ ํ์คํ ๋ค๋ฅด๋ค. ํ์ง๋ง ๋น๋๊ธฐ ์ฒ๋ฆฌ๋ ๋ง์ฐฌ๊ฐ์ง๋ผ๊ณ ๋๋ผ๊ณ ๋ค์ํ ์์ ์ ํ์ฉํด ๋ด์ผํ ๊ฒ์ด๋ค.
์ผ๋จ ์ฒ์ ๋ฐฐ์ด ๊ฐ๋ ์ ์ต์ํด์ง๋ ๊ฒ์ด ์ฐ์ ์ด๋๊น..!
๊ทธ๋๋ ๋น๋๊ธฐ๊ฐ ์ด๋ ค์ด ๊ฐ๋ ์ด๋ผ๊ณ ์๊ฐํ๋๋ฐ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ๋ชฉ์ ๊ณผ ์์ ์ด์ ๋ฅผ ์์๋ด๋ ค๊ณ ๋ ธ๋ ฅํ๋๊น ์ดํด๊ฐ ๋น๊ต์ ์ฝ๊ฒ ๋์๋ค.
์ด๋ ํ ๊ฐ๋ ์ด๋ ์ง ๋ชฉ์ ๊ณผ ์ด์ ๋ฅผ ํ์คํ ์๊ฐํด๋ณด์!
"ํจ์คํธ์บ ํผ์ค ํ๋ก ํธ์๋ ์ด๊ฒฉ์ฐจ ์ธ๊ฐ ์ฐธ์กฐ"