Async function๋ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฃผ ๊น๋ํ๊ฒ ์์ฑํ๋๋ก ๋๋ ํจ์์ด๋ค. (Promiseํจ์๋ณด๋ค ๋ ๊น๋!)
Promise ์์ ์ ์ฉ๋๊ธฐ ๋๋ฌธ์ Promise์ ๋ฟ๋ฆฌ๋ ์คํ์ด๋ผ๊ณ ๋ ํ๋ค.
์ฐธ๊ณ **IE์์๋ ์ง์ํ์ง ์๋๋ค. **
async & await
async ์์ฒด๊ฐ ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ก ์ ์ธํ๋ ํค์๋์ด๋ค.
ํจ์ ์์ async๋ฅผ ์ ๋ ฅํด์ ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ก ์ ์ธํ๋ฉด, ํจ์๋ ์๋์ผ๋ก Promise๋ฅผ ๋ฐํํ๋ค.
โฅ ๋น ํจ์๋ฅผ ํธ์ถํ๋ฉด undefined๊ฐ ์ถ๋ ฅ๋๋ค.
โฅ ๋น์ด์๋ async ํจ์๋ฅผ ํธ์ถํ๋ฉด Promise๊ฐ ์ถ๋ ฅ๋๋ค.
โฅ ๋น์ด์๋ async ํ์ดํ ํจ์๋ฅผ ํธ์ถํ๋ฉด Promise๊ฐ ์ถ๋ ฅ๋๋ค.
โฅ async ํ์ดํ ํจ์๋ฅผ ํธ์ถํ๋ฉด Promise๊ฐ ๋ฆฌํด๋๋ค.
Promise์ ์๋ฆฌ
ํจ์๊ฐ ๊ฐ์ ๋ฐํํ ๋, resolved ์ํ๋ก ๋ฐํ๋๋ค.
const newFun = async () => {
return 'LA LA LA LA'
}
newFun().then((data) => {
console.log('PROMISE RESOLVED WITH:', data)
})
// ์ถ๋ ฅ๊ฐ
PROMISE RESOLVED WITH: LA LA LA LA
Promise {<fulfilled>: undefined}
โฅ ์ฌ๊ธฐ์๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ๊ฐ ์คํ๋์ง ์๋๋ค.
๊ทธ๋ฅ ๋ฌธ์์ด๋ง ์ถ๋ ฅ๋๊ธฐ ๋๋ฌธ์ async ํจ์๋ฅผ ์ธ ์ด์ ๊ฐ ์๋๊ฑฐ๋ค
Promise๊ฐ ์คํจ๋ก ๋จ๊ฒ ํ๋ ๋ฐฉ๋ฒ์ ๋น๋๊ธฐ ํจ์์ ์ค๋ฅ๋ฅผ ๋์ง๋ฉด ๋๋ค.
const newFun = async () => {
throw new Error('UH OH')
return 'LA LA LA LA'
}
๐ ์ถ๋ ฅ๊ฐ
** ๋น๋๊ธฐ ํจ์(asyncํจ์)์ ์ค๋ฅ๊ฐ ์์ผ๋ฉด Promise์ ์ํ๋ ์คํจ๋ก ๋ฌ๋ค.
throw 'ERROR'
Async ํค์๋๋ฅผ ์ด์ฉํด์ ๋น๋๊ธฐ ํจ์๋ก ์ ์ธํ๋ ๋ฐฉ๋ฒ (๋น๋๊ธฐ ์ฒ๋ฆฌ ๊ณผ์ ์ ์๋ค. )
Promise๊ฐ ๊ฐ์ผ๋ก ๋ฐํ๋๊ณ , ๋ด๋ถ์ ๊ฐ์ด ์๋๋์ ๋ฐ๋ผ ์ฑ๊ณต๊ณผ ์คํจ๊ฐ ๊ฒฐ์ ๋๋๋ฐ
๋ฐํ๊ฐ์ด ์์ผ๋ฉด resolved๊ฐ ๋ํ๋๊ณ , ์ค๋ฅ๊ฐ ์์ผ๋ฉด ์ค๋ฅ๊ฐ๊ณผ ํจ๊ป rejected๊ฐ ๋ฌ๋ค.
1. ์ธ์๋ฅผ ๋ ๋ฃ์์๋
const login = async (username, password) => {
if(!username || !password) throw 'Missing Credentials'
if(password === 'corgifeetarecute') return 'WELCOME!'
throw 'Invalid Password'
}
login('alsltjsals')
.then(msg => {
console.log('LOGGED IN!')
console.log(msg)
})
.catch(err => {
console.log('ERROR')
console.log(err)
})
๐ ์ถ๋ ฅ๊ฐ
โฅ ์ธ์๋ฅผ ๋ ๊ฐ๋ฅผ ๋ฃ์ด์ผํ๋๋ฐ, 'alsltjsals' ํ๋๋ง ์ ๋ ฅํด์ ๋๋ฝ๋์๋ค๋ ๋ฌธ๊ตฌ๊ฐ ๋ฌ๋ค.
2. ์กฐ๊ฑด์ ๋ง์ง ์์๋
const login = async (username, password) => {
if(!username || !password) throw 'Missing Credentials'
if(password === 'corgifeetarecute') return 'WELCOME!'
throw 'Invalid Password'
}
login('alsltjsals', 'catiscute')
.then(msg => {
console.log('LOGGED IN!')
console.log(msg)
})
.catch(err => {
console.log('ERROR')
console.log(err)
})
๐ ์ถ๋ ฅ๊ฐ
โฅ ์ ํจํ์ง ์์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฃ์ด์ 'Invalid Password' ๊ฐ ์ถ๋ ฅ๋๊ฑฐ๋ค.
3. ์กฐ๊ฑด์ ๋ง์๋
const login = async (username, password) => {
if(!username || !password) throw 'Missing Credentials'
if(password === 'corgifeetarecute') return 'WELCOME!'
throw 'Invalid Password'
}
login('alsltjsals', 'corgifeetarecute')
.then(msg => {
console.log('LOGGED IN!')
console.log(msg)
})
.catch(err => {
console.log('ERROR')
console.log(err)
})
๐ ์ถ๋ ฅ๊ฐ
โฅ ์๋ง์ ๋น๋ฐ๋ฒํธ๋ฅผ ๋ฃ์ด์ ๋ก๊ทธ์ธ์ด ๋์๋ค.
๋น๋๊ธฐ ํจ์ ์ฒ๋ฆฌ ๊ณผ์
Await ํค์๋๋ ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์ฐ๋ฉด์ ๋๊ธฐ์ ์ผ๋ก ๋ณด์ด๊ฒ ํด์ค๋ค.
await ํค์๋์ ์ญํ ์ ๊ธฐ๋ค๋ฆฌ๊ฒ ํ๋ ๊ฒ์ธ๋ฐ,
Promise๊ฐ ๊ฐ์ ๋ฐํํ ๋๊น์ง๋ฅผ ๊ธฐ๋ค๋ฆฌ๊ธฐ ์ํด ๋น๋๊ธฐ ํจ์์ ์คํ์ ์ผ์ ์ ์ง์ํจ๋ค.
** ๋น๋๊ธฐ ํจ์์์๋ง ์ ์ฉํ๊ธฐ ๋๋ฌธ์ ASYNC & AWAIT๋ ํ ์์ด๋ค!
๐ Promise๋ฅผ ์์ฑํ๊ณ .then์ผ๋ก ์ฐ๊ฒฐํ๋ ๋ฐฉ๋ฒ
const delayedColorChange = (color, delay) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
document.body.style.backgroundColor = color;
resolve();
}, delay)
})
}
delayedColorChange('red', 1000)
.then(() => delayedColorChange('orange', 1000))
.then(() => delayedColorChange('yellow', 1000))
.then(() => delayedColorChange('green', 1000))
.then(() => delayedColorChange('blue', 1000))
๐ ์ ํจ์๋ฅผ ๋น๋๊ธฐ ํจ์๋ฅผ ์จ๋ณด์!
const delayedColorChange = (color, delay) => {
return new Promise((resolve, reject) => {
setTimeout(() => {
document.body.style.backgroundColor = color;
resolve();
}, delay)
})
}
async function rainbow() {
await delayedColorChange('red', 1000) // await ํค์๋๋ฅผ ์ฐ๋ฉด Promise๊ฐ ๊ฒฐ๊ณผ๋ฅผ ๋ผ ๋๊น์ง ๊ธฐ๋ค๋ ค์ค๋ค.
await delayedColorChange('orange', 1000)
await delayedColorChange('yellow', 1000)
await delayedColorChange('green', 1000)
await delayedColorChange('blue', 1000)
console.log('ALL DONE');
}
๐ 'ALL DONE'์ ํ๋์์ด ๋ํ๋ ํ์ ์ฝ์์ฐฝ์ ์ฐํ๋ค.
โฅ .then์ ์ฐ๊ฑฐ๋ ์ฝ๋ฐฑ์ ์ ๋ฌํ๊ฑฐ๋ ๋ฐํ๋ ๊ฐ์ ์ฐ๊ฒฐํ ํ์๋ ์๋ค.
rainbow().then(() => console.log('end of rainbow!'))
๐ 'end of rainbow!' ๋ ํ๋์์ด ๋ํ๋ ํ์ 'ALL DONE'๊ฐ ์ฐํ๊ณ ๋ ๋ค์ ๊ฑฐ์ ๋์์ ์ฝ์์ฐฝ์ ์ ๋ ฅ๋๋ค.
๊ธฐ๋ค๋ฆฌ๊ณ ์๋ Promise๊ฐ reject๋์ ๋
const fakeRequest = (url) => {
return new Promise((resolve,reject) => {
const delay = Math.floor(Math.random() * 4500) + 500;
setTimeout(() => {
if(delay > 4000) {
reject('Connection Timeout :(')
} else {
resolve(`Here is your fake data from ${url}`)
}
}, delay)
})
}
async function makeTwoRequests() {
let data1 = await fakeRequest('/page1');
console.log(data1);
}
๐ ๊ฒฐ๊ณผ๊ฐ
โฅ resolve, reject ๊ฒฐ๊ณผ๊ฐ 2๊ฐ์ง ๋์จ๋ค.
console.log(data1)์ด ์คํ๋์ง ์์์ ์ค๋ฅ๊ฐ ๋ฐ์ํ๊ฑฐ๋ผ๊ณ ์๊ฐํ๋ฉด ๋๋ค.
try {
dkdidjdu.log('hi')
} catch (e) {
console.log('its ok', e)
}
โฅ try ๋ฌธ์ ์ค๋ฅ๊ฐ ๋ ์ฝ๋๋ฅผ ์ ์ผ๋ฉด, catch๋ฌธ์์๋ ์ด๋ป๊ฒ ์ฒ๋ฆฌํ ์ง ์ ์ํ๋ค. e๋ ์ค๋ฅ ๊ทธ ์์ฒด๋ฅผ ๋ํ๋ธ๋ค.
โฅ ์ฌ๊ธฐ์๋ ์ฐธ์กฐ ์ค๋ฅ๊ฐ ๋ฐ์ํ๋ค.
const fakeRequest = (url) => {
return new Promise((resolve,reject) => {
const delay = Math.floor(Math.random() * 4500) + 500;
setTimeout(() => {
if(delay > 4000) {
reject('Connection Timeout :(')
} else {
resolve(`Here is your fake data from ${url}`)
}
}, delay)
})
}
async function makeTwoRequests() {
try {
let data1 = await fakeRequest('/page1');
console.log(data1);
let data2 = await fakeRequest('/page2');
console.log(data2);
} catch (e) {
console.log('caught an error!')
console.log('error is:', e)
}
}
๐ ๊ฒฐ๊ณผ๊ฐ
โฅ Promise๊ฐ ์ด๋ค ๊ฐ์ผ๋ก reject๋๋ ๊ฐ์ reject๋ ์ด์ ๋ ์ ๋ณด๊ฐ ๋์จ๋ค. (์ ์์์์๋ ์ฐ๊ฒฐ ์๊ฐ ์ด๊ณผ๋ก ๊ฐ์ ํจ)
catch๋ฌธ์ ๋งค๊ฐ๋ณ์๊ฐ ์์ด์ผ ์ด์ ๋ ์ ๋ณด์ ์ ๊ทผ ๊ฐ๋ฅํ๋ค!!
๐ ์๋ชป๋ ๊ฐ๋ ์ ๋ฌ์ด ์๋ค๋ฉด ๋๊ธ ๋ถํ๋๋ฆฝ๋๋ค. ์ ์ ์ฑ์ฅ์ ํฐ ๋์์ด ๋ฉ๋๋ค๐ค