async/await
async/await ๋ฌธ๋ฒ์ ES8์ ํด๋นํ๋ ๋ฌธ๋ฒ์ผ๋ก์, Promise ๋ฅผ ๋์ฑ ์ฝ๊ฒ ์ฌ์ฉ ํ ์ ์๊ฒ ํด์ค๋๋ค.
๊ธฐ๋ณธ์ ์ธ ์ฌ์ฉ๋ฒ์ ์์๋ด
์๋ค.
const sleep = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function process() {
console.log('์๋
ํ์ธ์!');
await sleep(1000);
console.log('๋ฐ๊ฐ์ต๋๋ค.!');
}
process();
// ๊ฒฐ๊ณผ)
์๋
ํ์ธ์!
๋ฐ๊ฐ์ต๋๋ค.!
async/await ๋ฌธ๋ฒ์ ์ฌ์ฉํ ๋์๋, ํจ์๋ฅผ ์ ์ธ ํ ๋ ํจ์์ ์๋ถ๋ถ์ async
ํค์๋๋ฅผ ๋ถ์ฌ์ฃผ์ธ์. ๊ทธ๋ฆฌ๊ณ Promise ์ ์๋ถ๋ถ์ await
์ ๋ฃ์ด์ฃผ๋ฉด ํด๋น ํ๋ก๋ฏธ์ค๊ฐ ๋๋ ๋๊น์ง ๊ธฐ๋ค๋ ธ๋ค๊ฐ ๋ค์ ์์
์ ์ํ ํ ์ ์์ต๋๋ค.
์ ์ฝ๋์์๋ sleep
์ด๋ผ๋ ํจ์๋ฅผ ๋ง๋ค์ด์ ํ๋ผ๋ฏธํฐ๋ก ๋ฃ์ด์ค ์๊ฐ ๋งํผ ๊ธฐ๋ค๋ฆฌ๋ Promise ๋ฅผ ๋ง๋ค๊ณ , ์ด๋ฅผ process
ํจ์์์ ์ฌ์ฉํด์ฃผ์์ต๋๋ค.
ํจ์์์ async
๋ฅผ ์ฌ์ฉํ๋ฉด, ํด๋น ํจ์๋ ๊ฒฐ๊ณผ๊ฐ์ผ๋ก Promise ๋ฅผ ๋ฐํํ๊ฒ ๋ฉ๋๋ค. ๋ฐ๋ผ์ ๋ค์๊ณผ ๊ฐ์ด ์ฝ๋๋ฅผ ์์ฑ ํ ์ ์์ต๋๋ค.
const sleep = (ms) => {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function process() {
console.log('์๋
ํ์ธ์!');
await sleep(1000);
console.log('๋ฐ๊ฐ์ต๋๋ค.!');
}
process().then(() => {
console.log('์์
๋๋ฌ์ด์!')
});
// ๊ฒฐ๊ณผ)
์๋
ํ์ธ์!
๋ฐ๊ฐ์ต๋๋ค.!
์์
๋๋ฌ์ด์!
async
ํจ์์์ ์๋ฌ๋ฅผ ๋ฐ์ ์ํฌ๋์๋ throw
๋ฅผ ์ฌ์ฉํ๊ณ , ์๋ฌ๋ฅผ ์ก์๋ผ ๋์๋ try/catch ๋ฌธ์ ์ฌ์ฉํฉ๋๋ค.
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function errorMake() {
await sleep(3000);
const error = new Error();
throw error;
};
async function process() {
try {
await errorMake();
} catch (e) {
console.log('then error : ', e) // ์ฌ๊ธฐ์ e๋ ์์ throw error;๋ฅผ ๊ฐ๋ฆฌํค๊ฒ ๋ฉ๋๋ค.!!
}
}
process();
// ๊ฒฐ๊ณผ)
then error : error
EX1)
new Promise
๋ก ์ ์ ํ๋ ์ฝ๋
function a(value) {
return new Promise((resolve, reject) => {
setTimeout(function() { // ์ฌ๊ธฐ์ setTimeout ํ๊ฒ์ ์๋ฒ์์ ํต์ ์์ ์๊ฐ์ ๊ฑธ๋ฆฐ๋ค๋ ๊ฐ์ ํด์ ์ด๋ฏธ๋ฅผ setTimeoutํจ์๋ฅผ ์ฌ์ฉํ๊ฒ์
๋๋ค.
resolve(value)
},1000)
})
}
function b(value) {
return new Promise((resolve, reject) => {
setTimeout(function() { // ์ฌ๊ธฐ์ setTimeout ํ๊ฒ์ ์๋ฒ์์ ํต์ ์์ ์๊ฐ์ ๊ฑธ๋ฆฐ๋ค๋ ๊ฐ์ ํด์ ์ด๋ฏธ๋ฅผ setTimeoutํจ์๋ฅผ ์ฌ์ฉํ๊ฒ์
๋๋ค.
resolve(value)
},1000)
})
}
function c(value) {
return new Promise((resolve, reject) => {
setTimeout(function() { // ์ฌ๊ธฐ์ setTimeout ํ๊ฒ์ ์๋ฒ์์ ํต์ ์์ ์๊ฐ์ ๊ฑธ๋ฆฐ๋ค๋ ๊ฐ์ ํด์ ์ด๋ฏธ๋ฅผ setTimeoutํจ์๋ฅผ ์ฌ์ฉํ๊ฒ์
๋๋ค.
resolve(value)
},1000)
})
}
function d(value) {
return new Promise((resolve, reject) => {
setTimeout(function() { // ์ฌ๊ธฐ์ setTimeout ํ๊ฒ์ ์๋ฒ์์ ํต์ ์์ ์๊ฐ์ ๊ฑธ๋ฆฐ๋ค๋ ๊ฐ์ ํด์ ์ด๋ฏธ๋ฅผ setTimeoutํจ์๋ฅผ ์ฌ์ฉํ๊ฒ์
๋๋ค.
resolve(value)
},1000)
})
}
function test(value) {
return new Promise((resolve, reject) => {
if(false) { // ์ ์์ ์ผ๋ก ์๋ฒ์ ํต์ ๋ชปํ๋ฉด (์๋ฌ ๋๋ฉด) ์คํ๋ฉ๋๋ค.
reject('Error') //reject('์ํ๋ ๋ฉ์ธ์ง ์์ฑ')
}
setTimeout(() => { // ์ฌ๊ธฐ์ setTimeout ํ๊ฒ์ ์๋ฒ์์ ํต์ ์์ ์๊ฐ์ ๊ฑธ๋ฆฐ๋ค๋ ๊ฐ์ ํด์ ์ด๋ฏธ๋ฅผ setTimeoutํจ์๋ฅผ ์ฌ์ฉํ๊ฒ์
๋๋ค.
resolve(value)
}, 1000);
})
}
then catch ์คํํ๋ ์ฝ๋
// then catch ์คํํ๋ ์ฝ๋
test('A').then((res) => {console.log(res)})
.then(() => b("B").then((res) => {console.log(res)}))
.then(() => c("C").then((res) => {console.log(res)}))
.then(() => d("D").then((res) => {console.log(res)}))
.catch((error) => {
console.log(error)
alert(error)
})
.finally(() => {
console.log('done!!')
alert('done!!')
})
ES8๋ฒ์ async await ์คํํ๋ ์ฝ๋
// ES8๋ฒ์ async await ์คํํ๋ ์ฝ๋
async function asyncFunc() {
try {
const a0 = await test('A!')
console.log(a0)
const a1 = await a('A')
console.log(a1)
const b1 = await b('B')
console.log(b1)
const c1 = await c('C')
console.log(c1)
const d1 = await d('D')
console.log(d1)
} catch (error) {
alert(error)
console.log(error)
} finally {
console.log('done!!')
}
}
asyncFunc()