*๏ธโฃ Callback Function - ์ธ์๋ก ๋๊ธฐ๋ ํจ์
- ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌ๋ ํจ์
- ์ธ๋ถ ํจ์ ๋ด์์ ํธ์ถ๋์ด ์ผ์ข ์ ๋ฃจํด ๋๋ ์์ ์ ์๋ฃํจ
- ๋๊ธฐ์, ๋น๋๊ธฐ์ ๋ชจ๋ ์ฌ์ฉ๋จ
- ๊ทธ๋ฌ๋ ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ํ ์ฝ๋ ์คํ์ ๊ณ์ํ๋ ๋ฐ ์ฃผ๋ก ์ฌ์ฉ๋จ
- ๋น๋๊ธฐ ์์ ์ด ์๋ฃ๋ ํ ์ฝ๋ ์คํ์ ๊ณ์ํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๊ฒฝ์ฐ๋ฅผ ๋น๋๊ธฐ ์ฝ๋ฐฑ(asynchronous callback)์ด๋ผ๊ณ ํจ
|JavaScript์ ํจ์ === โ์ผ๊ธ ๊ฐ์ฒด(First Class Object)โ
- ์ผ๊ธ ๊ฐ์ฒด (์ผ๊ธ ํจ์)
- ๋ค๋ฅธ ๊ฐ์ฒด๋ค์ ์ ์ฉํ ์ ์๋ ์ฐ์ฐ์ ๋ชจ๋ ์ง์ํ๋ ๊ฐ์ฒด(ํจ์)
- ์ผ๊ธ ๊ฐ์ฒด์ ์กฐ๊ฑด
- ์ธ์๋ก ๋๊ธธ ์ ์์ด์ผ ํจ
- ํจ์์ ๋ฐํ ๊ฐ์ผ๋ก ์ฌ์ฉํ ์ ์์ด์ผ ํจ
- ๋ณ์์ ํ ๋นํ ์ ์์ด์ผ ํจ
|Async callbacks
ํจ์ โ ํธ์ถ์ ํด์ผ ์๋ฏธ๋ฅผ ๊ฐ๊ฒ ๋จ!
- ๋ฐฑ๊ทธ๋ผ์ด๋์์ ์ฝ๋ ์คํ์ ์์ํ ํจ์๋ฅผ ํธ์ถํ ๋ ์ธ์๋ก ์ง์ ๋ ํจ์
- ๋ฐฑ๊ทธ๋ผ์ด๋ ์ฝ๋ ์คํ์ด ๋๋๋ฉด callback ํจ์๋ฅผ ํธ์ถํ์ฌ ์์
์ด ์๋ฃ๋์์์ ์๋ฆฌ๊ฑฐ๋, ๋ค์ ์์
์ ์คํํ๊ฒ ํ ์ ์์
- ์ฌ์ฉ ์์) addEventListener()์ ๋ ๋ฒ์งธ ๋งค๊ฐ๋ณ์
- callback ํจ์๋ฅผ ๋ค๋ฅธ ํจ์์ ์ธ์๋ก ์ ๋ฌํ ๋, ํจ์์ ์ฐธ์กฐ๋ฅผ ์ธ์๋ก ์ ๋ฌํ ๋ฟ์ด์ง ์ฆ์ ์คํ๋์ง ์๊ณ , ํจ์์ body์์ โcalled backโ๋จ. ์ ์๋ ํจ์๋ ๋๊ฐ ๋๋ฉด callback ํจ์๋ฅผ ์คํํ๋ ์ญํ ์ ํจ
|Why use callback ?
- callback ํจ์๋ ๋ช ์์ ์ธ ํธ์ถ์ด ์๋ ํน์ ๋ฃจํด ํน์ action์ ์ํด ํธ์ถ๋๋ ํจ์
- Django ์ ๊ฒฝ์ฐ โ์์ฒญ์ด ๋ค์ด์ค๋ฉดโ, event์ ๊ฒฝ์ฐ โํน์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉดโ์ด๋ผ๋ ์กฐ๊ฑด์ผ๋ก ํจ์๋ฅผ ํธ์ถํ ์ ์์๋ ๊ฑด โCallback functionโ ๊ฐ๋ ๋๋ฌธ์ ๊ฐ๋ฅ
- ๋น๋๊ธฐ ๋ก์ง์ ์ํํ ๋ callback ํจ์๋ ํ์
- ๋ช ์์ ์ธ ํธ์ถ์ด ์๋๋ผ ๋ค๋ฅธ ํจ์์ ๋งค๊ฐ๋ณ์๋ก ์ ๋ฌํ์ฌ ํด๋น ํจ์ ๋ด์์ ํน์ ์์
|callback Hell
- ์์ฐจ์ ์ธ ์ฐ์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ๊ธฐ ์ํด โcallback ํจ์๋ฅผ ํธ์ถํ๊ณ , ๊ทธ ๋ค์ callback ํจ์๋ฅผ ํธ์ถํ๊ณ , ๋ ๊ทธ ํจ์์ callback ํจ์๋ฅผ ํธ์ถํ๊ณ ...โ์ ํจํด์ด ์ง์์ ์ผ๋ก ๋ฐ๋ณต๋จ
- ์ฆ, ์ฌ๋ฌ ๊ฐ์ ์ฐ์ ๋น๋๊ธฐ ์์ ์ ํ ๋ ๋ง์ฃผํ๋ ์ํฉ
- ์ด๋ฅผ callback Hell(์ฝ๋ฐฑ ์ง์ฅ) ํน์ pyramid of doom(ํ๋ฉธ์ ํผ๋ผ๋ฏธ๋)์ด๋ผ ํจ
- ์์ ๊ฐ์ ์ํฉ์ด ๋ฒ์ด์ง ๊ฒฝ์ฐ ์๋ ์ฌํญ๋ค์ ํต์ ํ๊ธฐ ์ด๋ ค์
- ๋๋ฒ๊น
- ์ฝ๋ ๊ฐ๋ ์ฑ
|How to solve callback Hell?
- Keep your code shallow (์ฝ๋์ ๊น์ด๋ฅผ ์๊ฒ ์ ์ง)
- Modularize (๋ชจ๋ํ)
- Handle every single error (๋ชจ๋ ๋จ์ผ ์ค๋ฅ ์ฒ๋ฆฌ)
- Promise callbacks (Promise ์ฝ๋ฐฑ ๋ฐฉ์ ์ฌ์ฉ)
*๏ธโฃPromise
|Promise object - ๋ค์งํ๋ ๋๋
const myPromise = axios.get(URL)
//console.log(myPromise) // Promise Object
myPromise
.then(response => {
return response.data
})
//chaining
axios.get(URL)
.then(response => {
return response.data
})
.then(response => {
return response.title
})
.catch(error => {
console.log(error)
})
.finally(function(){
console.log('๋๋ ๋ง์ง๋ง์ ๋ฌด์กฐ๊ฑด ์ํ!!')
})
- ๋น๋๊ธฐ ์์
์ ์ต์ข
์๋ฃ ๋๋ ์คํจ๋ฅผ ๋ํ๋ด๋ ๊ฐ์ฒด
- ๋ฏธ๋์ ์๋ฃ ๋๋ ์คํจ์ ๊ทธ ๊ฒฐ๊ณผ ๊ฐ์ ๋ํ๋
- ๋ฏธ๋์ ์ด๋ค ์ํฉ์ ๋ํ ์ฝ์
- **์ฑ๊ณต(์ดํ)**์ ๋ํ ์ฝ์
- .then()
- **์คํจ(๊ฑฐ์ )**์ ๋ํ ์ฝ์
- .catch()
|Promise methods
.then(callback)
- ์ด์ ์์ (promise)์ด ์ฑ๊ณตํ์ ๋(์ดํํ์ ๋) ์ํํ ์์ ์ ๋ํ๋ด๋ callback ํจ์
- ๊ทธ๋ฆฌ๊ณ ๊ฐ callback ํจ์๋ ์ด์ ์์ ์ ์ฑ๊ณต ๊ฒฐ๊ณผ๋ฅผ ์ธ์๋ก ์ ๋ฌ ๋ฐ์
- ๋ฐ๋ผ์ ์ฑ๊ณตํ์ ๋์ ์ฝ๋๋ฅผ callback ํจ์ ์์ ์์ฑ
.catch(callback)
- .then์ด ํ๋๋ผ๋ ์คํจํ๋ฉด(๊ฑฐ๋ถ ๋๋ฉด) ๋์ (๋๊ธฐ์์ โtry - exceptโ ๊ตฌ๋ฌธ๊ณผ ์ ์ฌ)
- ์ด์ ์์ ์ ์คํจ๋ก ์ธํด ์์ฑ๋ error ๊ฐ์ฒด๋ catch ๋ธ๋ก ์์์ ์ฌ์ฉํ ์ ์์
๊ฐ๊ฐ์ .then() ๋ธ๋ก์ ์๋ก ๋ค๋ฅธ promise๋ฅผ ๋ฐํ
- ์ฆ, .then()์ ์ฌ๋ฌ ๊ฐ ์ฌ์ฉ(chaining)ํ์ฌ ์ฐ์์ ์ธ ์์ ์ ์ํํ ์ ์์
- ๊ฒฐ๊ตญ ์ฌ๋ฌ ๋น๋๊ธฐ ์์ ์ ์ฐจ๋ก๋๋ก ์ํํ ์ ์๋ค๋ ๋ป
.then()๊ณผ .catch() ๋ฉ์๋๋ ๋ชจ๋ promise๋ฅผ ๋ฐํํ๊ธฐ ๋๋ฌธ์ chaining ๊ฐ๋ฅ
์ฃผ์
- ๋ฐํ ๊ฐ์ด ๋ฐ๋์ ์์ด์ผ ํจ
- ์๋ค๋ฉด callback ํจ์๊ฐ ์ด์ ์ promise ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์ ์ ์์
.finally(callback)
- Promise ๊ฐ์ฒด๋ฅผ ๋ฐํ
- ๊ฒฐ๊ณผ์ ์๊ด์์ด ๋ฌด์กฐ๊ฑด ์ง์ ๋ callback ํจ์๊ฐ ์คํ
- ์ด๋ ํ ์ธ์๋ ์ ๋ฌ๋ฐ์ง ์์
- Promise๊ฐ ์ฑ๊ณต๋์๋์ง ๊ฑฐ์ ๋์๋์ง ํ๋จํ ์ ์๊ธฐ ๋๋ฌธ
- ๋ฌด์กฐ๊ฑด ์คํ๋์ด์ผ ํ๋ ์ ์์ ํ์ฉ
- .then()๊ณผ .catch() ๋ธ๋ก์์์ ์ฝ๋ ์ค๋ณต์ ๋ฐฉ์ง
//callback Hell์ฝ๋
work1(function(result1){
work2(result1,fucntion(result2){
work3(result2,function(result3){
console.log('์ต์ข
๊ฒฐ๊ณผ:'+ result3)
})
})
})
//Promise์ฝ๋(Promise Chaining)
work1().then(function(result1){
return work2(result1)
})
.then(function(result2){
return work3(result2)
})
.then(function(result3){
console.log('์ต์ข
๊ฒฐ๊ณผ: '+result3)
})
.catch(failureCallback)
|Promise๊ฐ ๋ณด์ฅํ๋ ๊ฒ
- Async callback ์์ฑ ์คํ์ผ๊ณผ ๋ฌ๋ฆฌ Promise๊ฐ ๋ณด์ฅํ๋ ํน์ง
- callback ํจ์๋ JavaScript์ Event Loop๊ฐ ํ์ฌ ์คํ ์ค์ธ Call Stack์ ์๋ฃํ๊ธฐ ์ด์ ์๋ ์ ๋ ํธ์ถ๋์ง ์์ โ๋น๋๊ธฐ์ ํน์ฑ ๋๋ฌธ!
- Promise callback ํจ์๋ Event Queue์ ๋ฐฐ์น๋๋ ์๊ฒฉํ ์์๋ก ํธ์ถ๋จ
- ๋น๋๊ธฐ ์์ ์ด ์ฑ๊ณตํ๊ฑฐ๋ ์คํจํ ๋ค์ .then() ๋ฉ์๋๋ฅผ ์ด์ฉํ์ฌ ์ถ๊ฐํ ๊ฒฝ์ฐ์๋ 1๋ฒ๊ณผ ๋๊ฐ ์ด ๋์
- .then()์ ์ฌ๋ฌ ๋ฒ ์ฌ์ฉํ์ฌ ์ฌ๋ฌ ๊ฐ์ callback ํจ์๋ฅผ ์ถ๊ฐํ ์ ์์ (Chaining)
- ๊ฐ๊ฐ์ callback์ ์ฃผ์ด์ง ์์๋๋ก ํ๋ํ๋ ์คํํ๊ฒ ๋จ
- Chaining์ Promise์ ๊ฐ์ฅ ๋ฐ์ด๋ ์ฅ์
*๏ธโฃAxios
- ๋ธ๋ผ์ฐ์ ๋ฅผ ์ํ Promise ๊ธฐ๋ฐ์ ํด๋ผ์ด์ธํธ
- ์๋๋ โXHRโ์ด๋ผ๋ ๋ธ๋ผ์ฐ์ ๋ด์ฅ ๊ฐ์ฒด๋ฅผ ํ์ฉํด AJAX ์์ฒญ์ ์ฒ๋ฆฌํ๋๋ฐ, ์ด๋ณด๋ค ํธ๋ฆฌํ AJAX ์์ฒญ์ด ๊ฐ๋ฅํ๋๋ก ๋์์ ์ค
- ํ์ฅ ๊ฐ๋ฅํ ์ธํฐํ์ด์ค์ ํจ๊ป ํจํค์ง๋ก ์ฌ์ฉ์ด ๊ฐํธํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ๊ณต
axios.get('<https://jsonplaceholder.typicode.com/todos/1>') //Promise return
.then(..)
.catch(..)
//Axios ์ฌ์ฉํ๊ธฐ
const URL = '<<a href=https://jsonplaceholder.typicode.com/todos/1>https://jsonplaceholder.typicode.com/todos/1</a>>'
async function test(){
const response = await axios.get(URL)
const data = response.data
console.log(data.title)
}
test().catch(err=>console.log(err))
//Axios ์์
const URL = '<https://jsonplaceholder.typicode.com/todos/1>'
axios.get(URL)
.then(function(response){
console.log(response)
return response.data
})
.then(function(data){
return data.title
})
.then(function(title){
console.log(title)
})
.catch(function(error){
console.log(error)
})
.finally(function(){
console.log('์ด๊ฑด ๋ฌด์กฐ๊ฑด ์คํ๋ฉ๋๋ค.')
})
*๏ธโฃasync & await
|async & await
<์ฌ์ฉ๋ฒ>
async - ์ฌ์ฉํ ํจ์ ์์ ๋ถ์ฌ์ค๋ค.
await - async ํจ์ ์ฌ์ฉ ์ axios์์ ๋ถ์ธ๋ค
- ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์์ฑํ๋ ์๋ก์ด ๋ฐฉ๋ฒ
- ECMAScript 2017(ES8)์์ ๋ฑ์ฅ
- ๊ธฐ์กด Promise ์์คํ
์์ ๊ตฌ์ถ๋ syntactic sugar
- Promise ๊ตฌ์กฐ์ then chaining์ ์ ๊ฑฐ
- ๋น๋๊ธฐ ์ฝ๋๋ฅผ ์กฐ๊ธ ๋ ๋๊ธฐ ์ฝ๋์ฒ๋ผ ํํ
- Syntactic sugar
- ๋ ์ฝ๊ฒ ์ฝ๊ณ ํํํ ์ ์๋๋ก ์ค๊ณ๋ ํ๋ก๊ทธ๋๋ฐ ์ธ์ด ๋ด์ ๊ตฌ๋ฌธ
- ์ฆ, ๋ฌธ๋ฒ์ ๊ธฐ๋ฅ์ ๊ทธ๋๋ก ์ ์งํ๋ ์ฌ์ฉ์๊ฐ ์ง๊ด์ ์ผ๋ก ์ฝ๋๋ฅผ ์ฝ์ ์ ์๊ฒ ๋ง๋ฆ
//Promise ์ฝ๋
const URL = '<https://dog.ceo/api>'
function fetchFirstDogImage() {
axios.get(URL + '/breeds/list/all')
.then(res => {
const breed = Object.keys(res.data.message)[0]
return axios.get(URL + `/breed/${breed}/images`)
})
.then(res => {
console.log(res)
})
.catch(err => {
console.error(err.response)
})
}
fetchFirstDogImage()
//async & await ์ฝ๋
const URL = '<https://dog.ceo/api>'
async function fetchFirstDogImage() {
const res = await axios.get(URL + '/breeds/list/all')
const breed = Object.keys(res.data.message)[0]
const images = await axios.get(URL + `/breed/${breed}/images`)
console.log(images)
}
fetchFirstDogImage()
.catch(err => console.error(err.response)
'Language > JavaScript' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
JavaScript - Event (0) | 2022.05.03 |
---|---|
JavaScript - DOM(Document Object Model) (0) | 2022.05.03 |
JavaScript - AJAX, Asynchronous (๋น๋๊ธฐ) (0) | 2022.05.03 |
JavaScript - ํ๋กํ ํ์ (prototype), ํด๋์ค(class) (0) | 2022.05.03 |
JavaScript - this (0) | 2022.05.02 |
๋๊ธ