: 순차적으로 코드 실행
: 순차적으로 코드 실행X
: 함수의 인수로 전달되는 또 다른 함수, 실행 순서를 보장함
const a = (callback) => { //callback 매개변수에 a()의 인수 들어감
setTimeout(() => {
console.log(1) //1 출력
callback() //callback 함수를 호출해서 실행위치 조절 => b 함수 호출
}, 1000) //1초 지연
}
const b = () => console.log(2)
a(() => {
b() //콜백지옥 발생할 수 있음
})
실행결과:
(1초지연 후)
1
2
: 콜백지옥 해결을 위해 사용할 수 있는 방법
const a = () => {
return new Promise(resolve => {
setTimeout(() => {
console.log(1)
resolve() //callback함수 기능
}, 1000)
})
}
const b = () => {
return new Promise(resolve => {
setTimeout(() => {
console.log(2)
resolve() //callback함수 기능
}, 1000)
})
}
const c = () => console.log(3)
//수정부분
a().then(() => {
return b()
}),then(() => { //then으로 전달되는 함수는 resolve로 들어감
return c()
})
//아래로 코드수정 가능
a()
.then(b)
.then(c)
실행결과:
(1초지연 후)
1
2
3
const a = () => { //a함수는 비동기 코드
return new Promise(resolve => {
setTimeout(() => {
console.log(1)
resolve() //b함수 동작
}, 1000)
})
}
const b = () => console.log(2)
const wrap = async() => {
await a()
b()
}
wrap()
실행결과:
(1초지연 후)
1
2
const delayAdd = (index, cb, errorCb => { //cb는 콜백
setTime(() => {
if (index > 10) {
errorCb(`${index}는 10보다 클 수 없습니다.`)
return
}
console.log(index) //if문 실행시 리턴으로 인해 아래 코드는 실행되지 않음
cb(index + 1)
}, 1000)
}
delayAdd(
13, //매개변수 index가 받음
res => console.log(res), //매개변수 cb가 받음, 정상적으로 로직 동작시 콜백 실행 부분
err => console.error(err) //매개변수 errorCb가 받음, 정상적으로 처리안될시 콜백 실행 부분
)
실행결과:
(에러)13는 10보다 클 수 없습니다.
const delayAdd = index => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(index>10) {
reject(`${index}는 10보다 클 수 없습니다.`) //정상적으로 처리되지 않았을 때 실행
return
}
console.log(index)
resolve(index + 1) //정상적으로 처리 되었을 때 실행
}, 1000)
})
}
delayAdd(13) // 매개변수 index 하나이기 때문에
.then(res => console.log(res)) //정상적으로 처리되었을때 실행할 콜백함수
.catch(err => console.error(err)) //reject으로 들어감
실행결과:
(에러)13는 10보다 클 수 없습니다.
then
과 catch
메서드를 사용const delayAdd = index => {
return new Promise((resolve, reject) => {
setTimeout(() => {
if(index>10) {
reject(`${index}는 10보다 클 수 없습니다.`)
return
}
console.log(index)
resolve(index + 1)
}, 1000)
})
}
delayAdd(13)
.then(res => console.log(res))
.catch(err => console.error(err))
const wrap = async () => {
try {
const res = await delayAdd(12)
console.log(res)
} catch(err) {
console.error(err)
}
}
wrap()
실행결과:
(에러)13는 10보다 클 수 없습니다.
(에러)13는 10보다 클 수 없습니다.
try catch
구문 사용:실행 결과와 상관없이 무조건 실행되는 구문
delayAdd(13)
.then(res => console.log(res))
.catch(err => console.error(err))
.finally(() => console.log('Done!')) //finally 구문
const wrap = async () => {
try {
const res = await delayAdd(12)
console.log(res)
} catch(err) {
console.error(err)
} finally {
console.log('Done!') //finally 구문
}
}
실행결과:
(에러)13는 10보다 클 수 없습니다.
Done!
(에러)13는 10보다 클 수 없습니다.
Done!
//위 코드 생략
const titles = ['frozen', 'avengers', 'avatar']
const wrap = async () => {
for (const title of titles) { //배열 반복문이므로 for of 사용
const movies = await getMovies(title)
console.log(title, movies)
}
}
wrap()
실행결과:
frozen
avengers
avatar
(실행시 항상 같은 순서로 출력됨)
fetch(url)
.then(res => res.json())
.then(json => console.log(json))
fetch(url)
.then(res => res.json())
.then(json => console.log(json))
const wrap = async () => {
const res = await fetch(url)
const json = await res.json()
console.log(json)
}
wrap()
fetch(url, {
method: 'GET' //어떤 값을 얻어낼때 사용(delete, post, put 사용가능)
headers: { //서버로 전송하는 요청에 대한 정보를 담음
'Content-Type': 'application/json' //json이라는 데이터의 포맷으로 통신
},
body: JSON.stringfy{{ //요청에 대한 데이터를 담아 전송, 모두 문자화해줘야 함
name: ksw,
age: 25
}
})
.then(res => res.json())
.then(json => console.log(json))