🔷 비동기 작업을 제어하기 위해 나온 개념이자 함수
function asyncPromiseWork() {
// 이런저런 코드들
//
const promise = new Promise((resolve, reject) => {
// promise 내부에서 비동기 상황이 종료될 때, resolve 함수 호출
// promise 내부에서 오류 상황일 때, reject 함수 호출
return resolve('complete')
})
}
// then의 result에는 resolve를 호출하며 넘긴 complete가 들어있음
asyncPromiseWork().then(result => console.log(result))
promiseWork()
.then(result => {
return promiseNextWork(result)
}).then(result => {
return promiseThirdWork(result)
}).then(result => {
return promiseFinalWork(result)
}).catch(e => {
alert('Error!')
}).finally(() => {
alert('에러와 상관 없이 작업 종료')
})
❗ catch를 안 넣을 경우 promise chain 중 에러가 발생했을 때 chain이 멈추니 넣는 것이 좋다.
// 기존의 callback 함수를 promise 형태로 만들기
const delay = (delayTime) => new Promise((resolve) => {
setTimeout(resolve, delayTime)
})
const doSomething = (message) => console.log(message)
delay(5000)
.then(() => {
doSomething('5초 경과')
return delay(3000)
}).then(() => {
console.log('완료')
})
🖨 출력 결과
🔷 Promise 내장 함수들
1) Promise.all(iterable)
const promise1 = delay(1000)
const promise2 = delay(2000)
const promise3 = delay(3000)
Promise.all([promise1, promise2, promise3]).then(() => {
// promise 1,2,3이 모두 처리된 후 호출
})
2) Promise.race(iterable)
3) Promise.any(iterable)
4) Promise.allSettled(iterable)
5) Promise.resolve
6) Promise.reject
🔷 동기 코드처럼 보이게 짤 수 있지만 실행은 여전히 비동기로 실행되게 하는 키워드
async function asyncRun() {
return '배가 고파요.'
}
console.log(asyncRun())
asyncRun().then((message) => console.log(message))
🖨 출력 결과
💡 기본적으로 await는 async로 감싸진 함수 scope에서만 사용 가능했지만, top level await가 등장하여 top level에서도 사용 가능하다.
const delay = (delayTime) => new Promise((resolve) => {
setTimeout(resolve, delayTime)
})
const doSomething = (message) => console.log(message)
const print = async () => {
await delay(5000)
doSomething('5초 경과')
await delay(3000)
console.log('완료')
}
print()
🖨 출력 결과
🔷 비동기 http 요청을 좀 더 쓰기 편하게 해주는 API
fetch('http://주소')
.then(res => {
return res.json
})
.then(data => {
console.log(JSON.parse(data))
})
fetch(imageUrl)
.then(res => {
return res.blob()
})
.then(blob => {
console.log(blob)
const objectURL = URL.createObjectURL(blob)
console.log(objectURL)
$image.src = objectURL
document.querySelector('body').appendChild($image)
})
❗ 네트워크 에러나 요청이 완료되지 못한 경우에만 reject 되기 때문에 response의 status code나 ok를 체크해주는 것이 좋다.
// res.ok는 status가 200~299 사이인 경우 true가 된다.
fetch('http://undefined.no.no/no-api')
.then(res => {
if(res.ok) {
return res.json()
}
throw new Error('요청을 처리하지 못했음!')
})
.then(result => {
console.log(result)
})
.catch(e => alert(e.message))
const headers = new Headers()
headers.append('x-auth-token', 'TOKEN')
fetch('https://주소', {
method: 'POST',
headers,
body: JSON.stringify(product)
})
머리가 아프다.
콜백함수부터 fetch까지 익숙해지도록 반복해서 코드를 볼 필요성이 느껴진다.