어떠한 작업이 순차적으로 실행되는 개념
요청을 하면 결과가 반환되는 것을 기다린다
- 매우 직관적인 설계방식
- 결과 반환까지 기다려야하는 단점이 존재
어떠한 작업들이 동시에 일어날 수 있는 개념
요청을 하면 결과 반환을 기다리지 않고 다음 작업이 바로 수행
- 병렬적으로 수행해 효율적이다
- 설계가 복잡하다는 단점
전체 source를 순회하는 쓰레드는 하나지만, DB를 조회하는 등의 시간 비용이 많이 드는 작업은 다른쓰레드로 위임하고 계속 소스를 순회한다
이러한 콜백함수는 콜백함수 안에서 다른 콜백함수를 부르고 결국 콜백지옥에 빠져서 가독성이 매우 나쁘다!
Promise chaining을 사용하면 callback처럼 긴 then지옥에 빠진다
class HttpError extends Error {
constructor(response) {
super(`${response.status} for ${response.url}`);
this.name = 'HttpError';
this.response = response;
}
}
function loadJson(url) {
return fetch(url)
.then(response => {
if (response.status == 200) {
return response.json();
} else {
throw new HttpError(response);
}
})
}
// 유효한 사용자를 찾을 때까지 반복해서 username을 물어봄
function demoGithubUser() {
let name = prompt("GitHub username을 입력하세요.", "iliakan");
return loadJson(`https://api.github.com/users/${name}`)
.then(user => {
alert(`이름: ${user.name}.`);
return user;
})
.catch(err => {
if (err instanceof HttpError && err.response.status == 404) {
alert("일치하는 사용자가 없습니다. 다시 입력해 주세요.");
return demoGithubUser();
} else {
throw err;
}
});
}
demoGithubUser();
lass HttpError extends Error {
constructor(response) {
super(`${response.status} for ${response.url}`);
this.name = 'HttpError';
this.response = response;
}
}
async function loadJson(url) {
let response = await fetch(url);
if (response.status == 200) {
return response.json();
} else {
throw new HttpError(response);
}
}
// 유효한 사용자를 찾을 때까지 반복해서 username을 물어봄
async function demoGithubUser() {
let user;
while(true) {
let name = prompt("GitHub username을 입력하세요.", "iliakan");
try {
user = await loadJson(`https://api.github.com/users/${name}`);
break; // 에러가 없으므로 반복문을 빠져나옵니다.
} catch(err) {
if (err instanceof HttpError && err.response.status == 404) {
// 얼럿 창이 뜬 이후에 반복문은 계속 돕니다.
alert("일치하는 사용자가 없습니다. 다시 입력해 주세요.");
} else {
// 알 수 없는 에러는 다시 던져집니다.
throw err;
}
}
}
alert(`이름: ${user.name}.`);
return user;
}
demoGithubUser();
개인적으로 Async와 Await는 공부를 해도 막상 사용하려고 하면 조금 헷갈린다. 예전에는 보통 디비에서 값을 불러오고 그 값을 사용하려면 async/await을 붙여야한다고 해서 사용했는데 비동기/동기에 대해서 배운 후 부터는 조금씩 이해를 하면서 사용하고있다. 그리고 프로젝트들에서 axios를 자주 썼는데 그때 then을 통해서 불러온 데이터를 저장하거나 사용했는데 그 이유도 axios가 promise기반의 API라서 그랬던것이라니..알고 보니까 신기하고 납득이 이제야 간다..!!!