드림코딩 by 엘리님 강의를 참고한 내용입니다.
https://youtu.be/JB_yU6Oe2eE
동기 / 비동기
- js는
hoisting 이후 순서에 따라
동기적
으로 실행되는 언어이다.
(hoisting: var 변수, 함수 선언 등이 자동으로 가장 위로 올라가는 것
)
비동기
: 언제 실행될 지 정확하게 알 수 없는 것.
콜백 함수
- 콜백 함수란,
필요할 때 불러서 쓰는 것
으로, 보다 더 발전한 것이 프로미스
다.
- 콜백 함수는
동기
또는 비동기
로 만들 수 있다.
function printWord(print) {
print();
}
printWord(() => console.log('word'));
프로미스(Promise)
- 콜백 함수보다
더 직관적
이며, 발전한 형태.
- javascript에서
비동기를 간편하게 처리
할 수 있도록 제공하는 object.
- 정상 기능 수행 시
성공값 출력
, 에러 발생 시 에러 메세지 출력
해줌.
진행 상태
(PromiseState) 파악이 중요( pending -> fulfilled or rejected )
Producer
, Consumer
로 나뉨
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
}, 2000);
}
promise
.then(value => {
console.log(value);
})
.catch(error => {
console.log(error);
})
.finally(() => {
console.log("finally");
});
then
은 새로운 promise 를 전달
할 수도 있다.
const fetchNum = new Promise((resolve, reject) => {
setTimeout(() => resolve(1), 1000);
});
fetchNum
.then(num => num * 2)
.then(num => {
return new Promise((resolve, reject) => {
setTimeout(() => resolve(num - 1), 1000);
});
})
.then(num => console.log(num));
async/await
syntactic sugar
(새로운 것을 추가하는 게 아니라, 기존에 있는 프로미스 위에 덧붙여진 것)
- function 앞에
async 를 붙이면 자동으로 Promise로 만들어진다.
프로미스를 동기식으로 작성한 것처럼 보이게
함
프로미스를 여러 번 중첩해야 하는 것의 대안
이 됨!
function delay(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function getApple() {
await delay(3000);
return "🍎";
}
async function getPeach() {
await delay(3000);
return "🍑";
}
function pickFruits() {
return getApple().then(apple => {
return getPeach().then(peach => `${apple} + ${peach}`);
});
}
pickFruits().then(console.log);
async function pickFruits() {
const apple = await getApple();
const peach = await getPeach();
return `${apple} + ${peach}`;
}
pickFruits().then(console.log);
function pickAllFruits(){
return Promise.all([getApple(), getPeach()])
.then(fruits => fruits.join(' + '));
}
pickAllFruits().then(console.log);
async/await 에서의 에러 처리
- 에러처리는
try
, catch
를 사용하여 한다.
- 유저에게
에러 메세지를 표시해야 하는 경우
(예: 컨트롤러에서 코드 성공 여부를 클라이언트에게 알려줘야 하는 경우)에 사용한다.
export const postContents = async(req, res) => {
const { title, description, hashtags } = req.body;
try {
await Contents.create({
title,
description,
hashtags,
});
return res.redirect("/");
} catch (error) {
return res.status(400).render("upload", {
pageTitle: "Upload Contents",
errorMessage: error._message,
});
}
};