동기는 데이터의 요청과 결과가 한 자리에서 동시에 일어나는것을 말한다.
동기 처리방식의 장단점 | |
---|---|
장점 | 설계가 매우 간단하고 직관적 |
단점 | 결과가 리턴 될 때까지 다른 활동을 할 수 없고 대기해야 함 |
비동기는 데이터의 요청과 결과가 동시에 일어나지 않는다.
비동기 처리방식의 장단점 | |
---|---|
장점 | 요청에 따른 결과가 반환되는 시간 동안 다른 작업을 수행 할 수 있음 |
단점 | 동기식보다 설계가 복잡함 |
async
&await
는 ES8문법으로서 가장 최근에 나온 문법이다.콜백함수
와promise
의 단점을 보
완하고 개발자가 읽기 좋은 코드를 작성하게 도와준다.
async
& await
는 promise
를 기반으로 하고있다. 모든 async함수는 promise를 리턴하고, 모든 await
함수는 일반적으로 promise가 된다.
1. 기본문법
async function 함수명() {
await 비동기처리_메서드명();
}
함수 앞에 async
를 붙이고, 호출할 비동기 함수(즉, promise)
앞에 await
키워드를 붙인다. 함수 앞
에 async
가 선언 되어야만 await
를 사용할 수 있다.
async async는 function앞에 위치한다. function앞에 async를 붙이면 해당 함수는 항상 promise를 반
환한다.
await await를 만나면 promise가 처리될 때 까지 기다린다. 결과는 그 이후에 변환된다. 일반 함수에
는 사용할 수 없다. async함수가 아닌데 await를 사용할 경우 문법 에러가 발생한다.
2. 기본적인 사용법
function sleep(ms) {
return new Promise(resolve => setTimeout(resolve, ms));
}
async function process() {
console.log('안녕하세요!');
await sleep(1000); // 1초쉬고
console.log('반갑습니다!');
}
process();
3. 예외처리 async
& await
에서 예외를 처리하는 방법은 바로 try-catch
다. promise에서 에러
처리를 위해 .catch()
를 사용했던 것처럼 async에서는 catch {}
를 사용하면 된다.
async function logTodoTitle() {
try {
var user = await fetchUser();
if (user.id === 1) {
var todo = await fetchTodo();
console.log(todo.title); // delectus aut autem
}
} catch (error) {
console.log(error);
}
}
Promise는 자바스크립트에서 비동기 작업을 좀 더 편리하게 처리 할 수 있도록 ES6에 도입된 기능이다.
const promise = new Promise((resolve, reject) => {
//executor 실행자, 실행 함수..
});
resolve
는 new Promise가 만들어 질때 자동으로 실행된다. executor의 인수 resolve
reject
는 자바
스크립트가 자체적으로 제공하는 콜백이다.
Promise의 3가지 상태(states) 프로미스는 3가지의 상태(states)를 가지며, 여기서 상태란 프로미스
의 처리 과정을 의미한다. new Promise()로 프로미스를 생성하고 종료될 때까지 3가지 상태를 가진다.
Pending
: 비동기 처리 로직이 아직 완료되지 않은 상태 (대기)Fulfilled
: 비동기 처리가 완료되어 프로미스가 결과 값을 반환해준 상태 (성공)Rejected
: 비동기 처리가 실패하거나 오류가 발생한 상태(실패)const myPromise = new Promise((resolve, reject) => {
setTimeout(() => {
resolve(1);
}, 1000);
});
myPromise.then(n => {
console.log(n);
});
작업이 끝나고 또 다른 작업을 하고자 할때, .then(...)을 붙어서 사용하면 된다.
const promise = new Promise((resolve, reject) => {
setTimeout(() => {
reject(new Error());
}, 1000);
});
myPromise
.then(n => {
console.log(n);
})
.catch(error => {
console.log(error);
});
성공하면 .then()메소드가 실행되고, 실패하면 reject를 사용하고, error는.catch()메소드를 사용해서 처리
한다.