
동기는 직렬적으로 작동하는 방식이고, 비동기는 병렬적으로 작동하는 것이다.
다시말해, 비동기란 특정 코드가 끝날때 까지 코드의 실행을 멈추지 않고 다음 코드를 먼저 실행하는 것이다.
JavaScript 엔진은 Single Thread라서 한 번에 하나의 작업만 수행할 수 있다.
즉, 자바스크립트는 기본적으로 동기식 처리 모델이라는 것이다. 그래서 JS 엔진은 비동기 처리가 가능하도록 설계되었다.

출처: 동기식 처리모델
콜백함수를 함께 알려준다. → 해당 태스크가 완료되었을 때 콜백함수 호출
출처: 비동기식 처리모델
콜백 헬(Callback Hell)이 발생하는 단점이 있다.first(function(v1){
second(v1, function(v2){
third(v2, function(v3){
fourth(v3, function(v4){
.....
});
});
});
});
JavaScript에서 비동기적으로 실행하는 작업의 결과(성공 resolve / 실패 reject)를 나타내는 객체
// 프로미스 객체를 반환하는 함수 생성
function myPromise() {
return new Promise((resolve, reject) => {
if (/* 성공 조건 */) {
resolve(/* 결과 값 */);
} else {
reject(/* 에러 값 */);
}
});
}
// 프로미스 객체를 반환하는 함수 사용
myPromise()
.then((result) => {
// 성공 시 실행할 콜백 함수
})
.catch((error) => {
// 실패 시 실행할 콜백 함수
});
성공 resolve임을 알려주는 객체실패 reject임을 알려주는 오류 객체resolve 메서드 호출then()으로 전달된다.reject 메서드 호출catch()로 전달된다finally 메서드 호출then 메서드는 promise 객체를 리턴하고 인수로 받은 콜백 함수들의 리턴값을 계속해서 이어 받는다.
→ promise chaining은 promise 핸들러를 연달아 연결하는 것을 의미한다.
const 장보기 = new Promise((resolve) => {
setTimeout(() => {
resolve("🥚 계란 구매 완료!");
}, 1000);
});
장보기
.then(result => {
console.log(result);
return "🍜 라면 끓이기 시작"; // 다음 작업으로 전달
})
.then(result => {
console.log(result);
return "🍳 계란 넣기"; // 다음 작업으로 전달
})
.then(result => {
console.log(result);
console.log("🎉 완성!");
});
async와 await는 자바스크립트의 비동기 처리 패턴 중 가장 최근에 나온 문법이다.
위에서 본 콜백함수와 프로미스의 단점을 보완하고, 가독성 좋은 코드를 작성할 수 있게 도와준다.
async function 함수() {
await 비동기처리_메서드();
}
async 키워드를 function 앞에 사용하면 해당 함수는 항상 Promise를 반환한다.
Promise가 아닌 값을 반환하더라도 이행 상태의 Promise(resolved promise)를 값을 감싸 반환한다.
→ 그냥 간단하게 생각하면 await를 사용하기 위한 선언문으로 봐도 된다.
// ✅ 함수 선언식
async function func1() {
const res = await fetch(url); // 요청을 기다림
const data = await res.json(); // 응답을 JSON으로 파싱
}
func1();
// ✅ 함수 표현식
const func2 = async () => {
const res = await fetch(url); // 요청을 기다림
const data = await res.json(); // 응답을 JSON으로 파싱
}
func2();
await는 async 함수 안에서만 동작한다.
이는, Promise가 처리될 때까지 기다리는 역할을 한다. 그리고 결과는 그 이후에 반환된다.
async function func() {
const res = await fetch(url); // 요청을 기다림
const data = await res.json(); // 응답을 JSON으로 파싱
// data 처리
console.log(data);
}
func();
await가 던진 에러는 try...catch 를 이용해서 잡을 수 있다.
async function func() {
try {
const res = await fetch(url); // 요청을 기다림
const data = await res.json(); // 응답을 JSON으로 파싱
// data 처리
console.log(data);
} catch (err) {
// 에러 처리
console.error(err);
}
}
func();