์ค๋์ ๋น๋๊ธฐ์ ์ฝ๋ฐฑ ๊ทธ๋ฆฌ๊ณ promise ๊ฐ์ฒด์ async await์ ๋ํด ํ์ต์ ์งํํ๋ค!
์๋ฐ์คํฌ๋ฆฝํธ์ ์๋์๋ฆฌ์ ๋ํด ๋ฐฐ์ฐ๋ฉด์ ๋น๋๊ธฐ์ ์กฐ๊ธ ๋ ์นํด์ง ๋๋์ด ์์์ง๋ง,, ์์ง์ ์ด์ฌ(์ด์ํ์ฌ์ด) ์ด๋ค ใ ใ
๋ ์ต๊ทผ ๋ค์ Todolist๋ฅผ ๋ง๋ค์ด๋ณด๋ฉด์ addeventlisener๋ฅผ ์ฌ์ฉํ ์ผ์ด ์์๋๋ฐ ์์ง ์ ๋๋ก ์์ง ๋ชปํ ์ฑ ์ฌ์ฉํ๋ ๋๋์ ๋ฐ์์ ๋น๋๊ธฐ ๊ทธ๋ฆฌ๊ณ ์ด๋ฅผ ๋ค๋ฃจ๋ ๋ฐฉ๋ฒ์ ๋ํด ํ์ต์ ์งํํ์๋ค.
ํ์ต์ ์บกํดํ๊ต๋์ ๋ธ๋ก๊ทธ๋ฅผ 90% ์ฐธ๊ณ ํ์๊ธฐ ๋๋ฌธ์ ์บกํดํ๊ต๋์ ๋ธ๋ก๊ทธ ๊ธ๊ณผ ์ ์ฌํ ์ ์๋ค..!
์บกํดํ๊ต๋์ ๋ธ๋ก๊ทธ ๊ธ
๋น๋๊ธฐ๋ ์ ๋ฐ์ํ ๊น? ์๋ฐ์คํฌ๋ฆฝํธ์ ๋์์๋ฆฌ์ ์ฐ๊ด์ด ์๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ ์ฝ๋๋ฅผ ์ฝ์ ๋ ๋น๋๊ธฐํจ์๊ฐ ๋์จ๋ค๋ฉด ์ด๋ฅผ ๊ธฐ๋ค๋ ค์ฃผ์ง ์๋๋ค.
์ฆ, ๋น๋๊ธฐ ํจ์์ ๊ฒฐ๊ณผ๊ฐ์ ๊ธฐ๋ค๋ ค์ฃผ์ง ์๋๋ค.
์์ธํ ๋งํ์๋ฉด ๋ชจ๋ ํจ์๋ stack์ ์์ธ ํ ์คํ์ด ๋๋๋ฐ ๋น๋๊ธฐํจ์๋ ๋ฐ๋ก stack์ผ๋ก ๊ฐ์ง ์๊ณ ๋๊ธฐ์ค์ ๊ฑฐ์ณ ์กฐ๊ฑด์ด ์๋ฃ๋๋ฉด queue๋ผ๋ ๊ณต๊ฐ์ ๋ค์ด๊ฐ๋ค. stack์ด ๋น์ด์๋ค๋ฉด ๊ทธ ๋ queue์ ์ ๋ถ๋ถ๋ถํฐ stack์ผ๋ก ๋ค์ด๊ฐ ํจ์๊ฐ ์คํ๋๋ค.
console.log(1)
setTimeout(function(){
console.log(2)
},3000)
console.log(3)
์ ์ฝ๋์ ๊ฒฐ๊ณผ๋ ์ด๋ป๊ฒ ๋์ฌ๊น?
์์ฐจ์ ์ผ๋ก 1 2 3์ด ์ถ๋ ฅ๋ ๊น?? ๊ฒฐ๊ณผ๋ ๊ทธ๋ ์ง ์๋ค.
1,3์ด ๋จผ์ ์ถ๋ ฅ๋๊ณ 2๋ 3์ด๋ค์ ์ถ๋ ฅ์ด๋๋ค.
์๋ฐ์คํฌ๋ฆฝํธ๋ console.log(1)์ ๋จผ์ ์ฝ๊ณ ๊ทธ ํ setTimeout์ ์ฝ๋๋ค. ๊ทธ ํ console.log(3)์ ์ฝ๋๋ค. setTimeout์ ๋น๋๊ธฐ ํจ์์ด๊ธฐ์ ๋๊ธฐ์ค๋ก ๋ณด๋ด ํด๋น ์กฐ๊ฑด(3์ด๊ฐ ์ง๋ฌ๋)์ด ์๋ฃ๋๋ฉด queue๋ก ๋ณด๋ธ๋ค.
stack์ด ๋น์ด์์ ๋ queue์์ stack์ผ๋ก ํด๋น console.log()๊ฐ ๋์ด๊ฐ 3์ด ์ถ๋ ฅ๋๋ค.
์ด๋ฌํ ์๋ฐ์คํฌ๋ฆฝํธ์ ํน์ฑ ๋๋ฌธ์ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฒ๋ฆฌํด์ค ์ ์์ด์ผํ๋ค.
์๋ํ๋ฉด ์ด๋ฌํ ๋น๋๊ธฐํจ์๊ฐ ๋๋์ง ์์๋๋ฐ ๊ทธ ๊ฒฐ๊ณผ๊ฐ์ ๊ฐ์ง๊ณ ์ฒ๋ฆฌํ๋ คํ๋ฉด ์ค๋ฅ๊ฐ ๋ฐ์ํ ๊ฒ์ด๊ณ ์ด ๋น๋๊ธฐ ํจ์๋ค์ ๋ชจ๋ ๊ธฐ๋ค๋ฆฐ ํ์ ๋ค๋ฅธ ์ฝ๋๋ฅผ ์คํํ์๋ ๋ ๋๋ฌด ์ค๋ ๊ฑธ๋ฆด ๊ฒ์ด๊ธฐ ๋๋ฌธ์ด๋ค.
๊ฒฐ๊ตญ ์ด๋ฌํ ๋น๋๊ธฐ ํจ์๋ฅผ ์ฒ๋ฆฌํ๋ ๋ฐฉ์์ =>์ฝ๋ฐฑ!!
์ฝ๋ฐฑ์ด๋ ๋ฌด์์ผ๊น?
์ฆ, ํจ์์ ์ธ์๋ก ๋ค์ด๊ฐ๊ฑฐ๋ ์ด๋ฒคํธ์ ์ํด ํธ์ถ๋์ด์ง๋ค๋ฉด ๊ทธ ํจ์๋ ์ฝ๋ฐฑํจ์์ด๋ค.
์๋ฅผ๋ค์ด
function Go(Callback){
if("you need stop"){
Callback()
}
function Stop(){
console.log("I need a rest")
}
}
Go(Stop())
์ด๋์ Stop ํจ์๋ ์ฝ๋ฐฑ์ด๋๋ค. ๊ทธ๋ ๋ค๋ฉด ์๊น์ ๋๊ฐ์ ์ฝ๋์์ ์ฝ๋ฐฑ์ผ๋ก ๋น๋๊ธฐ๋ฅผ ์ฒ๋ฆฌํ๋ค๋ ๋ง์ ๋ฌด์์ผ๊น?
function Print(){
console.log(2)
console.log(3)
}
console.log(1)
setTimeout(Print,3000)
์ด๋ฐ์์ผ๋ก ์ฝ๋ฐฑ์ ํ์ฉํ์ฌ ์กฐ๊ฑด์ด ๋ง์กฑ๋๋ฉด ํด๋น ์ฝ๋ฐฑํจ์๊ฐ ์ํ๋๋๋ก ๋ง๋ค๋ฉด๋๋ค.
ajax ํต์ ์ฝ๋๋ฅผ ํ์ฉํด์ ์ฝ๋ฐฑํจ์๋ฅผ ๊ฐ์ ํด๋ณด๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
๋จผ์ ์ฝ๋ฐฑํจ์๋ฅผ ์ ์ฉํ์ง ์์ ์์๋ฅผ ๋จผ์ ๋ณด๋ฉด
function getData() { // 1. ํจ์ ์ ์ธ 2. ํจ์ ๋์
7. ํจ์์คํ
var tableData; //8. ๋ณ์ ์ ์ธ 9. ๋ณ์ ์ด๊ธฐํ
$.get('https://domain.com/products/1', // 10. ํจ์์คํ 11. ์ฝ๋ฐฑ๋๊ธฐ
function(response) { // 3. ํจ์์ ์ธ 4, ํจ์๋์
tableData = response; //12. tableData ์ฌ์ ์ธ
});
return tableData; // 13. response๋ ์์ง๋ค์ด์ค์ง ์์ undefined
}
console.log(getData()); //5. console.log ์คํ 6. getDate()์คํ
์์ ๊ฐ์ด ์ด๋ฃจ์ด์ง๋ค. ์ฝ๋ ์คํ ์์๋ฅผ ์ฐธ๊ณ ํ๋ฉด ์ข๋ค. ๊ทธ๋ ๋ค๋ฉด reponse๊ฐ ๋ค์ด์ค๊ณ ๋ ํ ๋ค์ ํจ์์ธ console.log()๊ฐ ์คํ๋๋๋กํ๋ค๋ฉด ์ด๋ป๊ฒํ๋ฉด์ข์๊น?
๋ฐ๋ก ์ฝ๋ฐฑ์ ํ์ฉํ๋ ๊ฒ์ด๋ค!!
function getData(CALLBACK) {
$.get('https://domain.com/products/1',
function(response) {
CALLBACK(response)
//response๊ฐ ๋ฐ์์ค๋ฉด ์ด๊ฐ์ด CALLBACK์ ์ธ์๋ก ์ ํด์ง๋ค
});
}
function CALLBACK(data){
console.log(data)//๊ฐ์ ธ์จ response๋ฅผ console!!
}
getDate(CALLBACK(data))
๊ทธ๋ ๋ค๋ฉด ์ฝ๋ฐฑ ์ง์ฅ๋ ์ด์ ์ดํดํ ์ ์๋ค!!!
ํ์๋ ์ฝ๋ฐฑ ์ง์ฅ์ด๋ผ๋ ํ์์ด ์์ด๋ฌ๋๋์ง ์ ์ดํดํ์ง ๋ชปํ๋ค.
ํต์ฌ์ "์ฝ๋ฐฑ์ ํตํด ๊ฒฐ๊ณผ๊ฐ์ ์ ๋ฌํด์ฃผ๊ธฐ ๋๋ฌธ์ ๋ฐ์ํ๋ค."
step1(function(value1) {
step2(function(value2) {
step3(function(value3) {
step4(function(value4) {
step5(function(value5) {
step6(function(value6) {
// Do something with value6
})
})
})
})
})
})
๊ฒฐ๊ตญ ์ฝ๋ฐฑ์ ํจ์์ ์ธ์๋ก ์ฌ์ฉ๋์ด ํด๋น ํจ์์ ์คํ์์๋ฅผ ๋๊ธฐ์ ์ผ๋ก ๋ณด์ด๊ฒ ๋ง๋ ๋ค. ๊ทธ๋ ๊ฒ ํ๋ค๋ณด๋ฉด ํจ์๋ค์ด ๊ผฌ๋ฆฌ์ ๊ผฌ๋ฆฌ๋ฅผ ๋ฌผ๊ฒ ๋๋ ๊ฒฝ์ฐ๊ฐ ๋ฐ์ํ๋ค.
์ดํด๋ฅผ ๋๊ธฐ์ํด print ํจ์๊ฐ ๋น๋๊ธฐ์ ํจ์๋ผ๊ณ ๊ฐ์์ผ๋ก ์๊ฐํด๋ณด์
function print(next){
console.log(1)
next(next2){
console.log(2)
next2(next3){
console.log(3)
next3(next4){
console.log(4)
next4(next5){)
console.log(5
}
}
}
}
๊ฒฐ๊ตญ ์์๋ฅผ ์งํค๋ ค๊ณ ์ด ๋ค์ ํจ์๋ค์ ์ฎ์ด์ ๋ฃ๋ค๋ณด๋ฉด ์ฝ๋ฐฑ ์ง์ฅ์ด ๋ง๋ค์ด์ง๋ ๊ฒ์ด๋ค.
์ด ์ฝ๋ฐฑ์ง์ฅ์ด ์์๊ธฐ๋ฉด์ ๋น๋๊ธฐ๋ฅผ ์ฒ๋ฆฌํ ์ ์๋๋ก ๋์์ฃผ๋ ๊ฐ์ฒด๊ฐ ๋ฐ๋ก Promise ๊ฐ์ฒด์ด๋ค.
Promise๋ ๋น๋๊ธฐ ์ฒ๋ฆฌ์ ์ฌ์ฉ๋๋ ๊ฐ์ฒด์ด๋ค.
function getData(callbackFunc) {
$.get('url ์ฃผ์/products/1', function(response) {
callbackFunc(response);
});
}
getData(function(tableData) {
console.log(tableData);
});
์ ์ Promise๋ฅผ ์ ์ฉํ๋ฉด ๋ค์๊ณผ ๊ฐ๋ค.
function getData(){{
return new Promise(function(resolve,reject){
$.get(`url ์ฃผ์/product/1`,function(response){
resolve(response)
})
})
}
getData().then((data)=>console.log(data))
//ํด๋น response๊ฐ data๋ก ๋ค์ด๊ฐ๋ค.
์ ๋ชจ๋ฅด๊ณ ์ผ์ ๋๋ ๊ทธ๋ฅ ์ฌ์ฉ๋ฐฉ๋ฒ๋ง ์ธ์ฐ๊ณ ์์๋๋ฐ.. ์๊ณ ๋ณด๋ promise๊ฐ ํจ์์ด๋ค.. ์ฝ๋ฐฑ์ง์ฅ๋ ์์ ์ฃผ๋ฉด์ ํด๋น ๊ฐ์ด ๋ค์ด์ค๋ฉด ์ด๋ฅผ resolve๋ฅผํตํด ๊ทธ ๊ฐ์ ์ด์ด ์ ๋ฌํด ์ค ์ ์๋ค๋!!
ajaxํต์ ์ ์ต์์น ์์ setTimeout ๋ฉ์๋๋ก promise๋ฅผ ํ์ตํด๋ณด์๋ค.
function getData() {
return new Promise((resolve, reject) => {
setTimeout(() => {
console.log("123");
resolve("์ฑ๊ณต");
}, 3000);
});
}
getData().then((data) => console.log(data));
setTimeout ๋น๋๊ธฐํจ์๊ฐ ํด๋น ์กฐ๊ฑด์ด ๋๋๋ฉด resolve๋ฅผ ํตํด ์ด๋ค ๊ฐ์ ๊ฐ์ ธ์ค๋๋ก ํ์๋ค.
Promise๋ ๊ฒฐ๊ตญ ๊ฐ์ฒด์ด๊ณ new Promise๋ฅผ return ํ๋ค๋ ๊ฒ์ Promise ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ค๋ ๊ฒ์ด๋ค. ์ฑ๊ณต๋๋ฉด than์ด๋ผ๋ ๊ฐ์ฒด๋ด๋ถ์ ํ๋กํผํฐ์ ์ ๊ทผํ์ฌ resolve ํด์จ ๊ฐ์ ์ ๊ทผ ํ ์ ์๊ณ ์คํํ๋ฉด catch๋ผ๋ ๊ฐ์ฒด๋ด๋ถ์ ํ๋กํผํฐ์ ์ ๊ทผํ์ฌ error๋ฅผ ๊ฐ์ ธ์ฌ ์ ์๋ค.
async await๋ ํ์๊ฐ ๋๋ผ๋ ๋ฐ๋ก๋ Promise๋ฅผ ๋ ๊ฐ๋ ์ฑ ์ข๊ฒ ๋ค๋ฃจ๊ธฐ ์ํด ์ฌ์ฉ๋๋ ๋ฌธ๋ฒ!
๊ธฐ๋ณธ ๋ฌธ๋ฒ์ ๋ค์๊ณผ ๊ฐ๋ค.
async function ํจ์๋ช
(){
await ๋น๋๊ธฐ์ฒ๋ฆฌ๋ฉ์๋()
console.log("123")
}
์ฌ์ค async await๊ฐ ์๋๋ผ๋ฉด ๋น๋๊ธฐ๋ฅผ ํ์ตํ๊ธฐ ์ด์ ์ ๋๋ก ๋์๊ฐ ๊ฒ๊ณผ ๊ฐ๋ค.
๋ง์ฝ ์ ์ํ๋ก ์ฝ๋๊ฐ ์งํ๋๋ค๋ฉด ๋น๋๊ธฐ ์ฒ๋ฆฌ ๋ฉ์๋๋ ์ ์ณ๋๊ณ 123์ด ๋จผ์ ์ถ๋ ฅ ๋์ง ์์๊น??
ํ์ง๋ง async await๋ฅผ ์ฅ์ฐฉ(?) ํด์ฃผ์๊ธฐ ๋๋ฌธ์ ์์ฐจ์ ์ผ๋ก ์์์๋ถํฐ ์คํ์ด ๋๋ค.
์ด๊ฒ ๋ฐ๋ก async await์ด๋ค! ์ฌ๊ธฐ์ ์ค์ํ ์ ์
awailt๋ฅผ ๋ฐ๋ ๋น๋๊ธฐํจ์๋ ๊ฐ์ฒด๋ฅผ ๋ฐํํ๋ ๊ฒฝ์ฐ๋ง ๊ฐ๋ฅํ๋ค!
function fetchData(){
return new Promise((resolve,reject)=>{
const item=[1,2,3]
resolve(item)
})
}
async function PrintItem(){
const item = await fetchData()
console.log(item)//[1,2,3]
}
PrintItem()
์ด๋ ๊ฒ ๋น๋๊ธฐํจ์์์๋ ๋๊ธฐํจ์๋ฅผ ์คํํ๋ ๋ฏํ ๊ฒฝํ์ ํ๊ฒ ํด์ฃผ๋ ๊ฒ์ด๋ค!
๊ทธ๋ ๋ค๋ฉด async await๋ ์ด๋ป๊ฒ ์ค๋ฅ์ฒ๋ฆฌ๋ฅผ ํด์ค๊น?
try - catch!! ๋ฌธ์ผ๋ก ์์ธ๋ฅผ ์ฒ๋ฆฌํด์ฃผ๋ฉด๋๋ค.
์ฆ, ๋๊ธฐํจ์์ ๋์ผํ๊ฒ ํด์ฃผ๋ฉด๋๋ค!!!!