그렇다면 동기와 비동기가 무엇일까?
function func1() {
console.log('첫번째');
func2();
}
function func2(){
console.log('두번째');
func3();
}
function func3() {
console.log('세번째');
}
func1();
// 출력 순서
// 첫번째
// 두번째
// 세번째
function func1(){
console.log('첫번째');
func2();
}
function func2(){
setTimeout(function(){
console.log('두번째');
}, 0);
func3();
}
function func3(){
console.log('세번째');
}
func1();
// 출력 순서
// 첫번째
// 세번째
// 두번째
📌 JavaScript는
동기적
이고, blocking(블로킹)이며, single-threaded(싱글 스레드)한 언어이다. 그러나 모든 것에서의 특성을 의미하지 않고 오직 한 연산에서의 특성을 의미한다.
자바스크립트는 네트워크 상 웹 브라우저에서 사용하는 언어이다. 그러므로 자바스크립트는 통신이라는 개념을 가지고 있다. 통신 중 어떤 함수가 일 처리가 길어지면, 웹 브라우저는 계속 멈춤 상태가 되고 기다려야 된다. 통신 중 계속 기다려야 되는 상황을 방지하기 위해 비동기 방식을 가지게 된다.
function Callback(callback){
console.log('콜백 함수');
callback();
}
Callback(function(){
console.log('콜백 받는곳');
})
콜백 지옥
에 빠질 수 있다..then()
을 호출한다..catch()
메소드를 호출되게 한다. 기존 try-catch
를 이용해서도 예외처리가 가능하지만 자바스크립트에서는 promise의 catch
를 사용하라는 warning message를 출력한다.(예외처리)module
지향적이다.비동기 처리가 완료 되지 않았다면 Pending
, 완료 되었다면 Fulfilled
, 실패하거나 오류가 발생하였다면 Rejected
상태를 갖는다.
const condition = true;
const promise = new Promise((resolve, reject) => {
if (condition) {
resolve('resolved');
} else {
reject('rejected');
}
});
promise
.then((res) => {
console.log(res);
})
.catch((error) => {
console.error(error);
});
(async () => {
const condition = true;
const promise = new Promise((resolve, reject) => {
if (condition) {
resolve('resolved');
} else {
reject('rejected');
}
});
try {
const result = await promise;
console.log(result);
} catch (err) {
console.error(err);
}
})();