🔎 동기란?
먼저 시작된 하나의 작업이 끝날 때까지 다른 작업을 시작하지 않고 기다렸다가, 다 끝나면 새로운 작업을 시작하는 방식
🔎 비동기란?
먼저 시작된 작업의 완료 여부와는 상관없이 새로운 작업을 시작하는 방식
setTimeout()
, setInterval()
, fetch()
function fetchServer() {
setTimeout(() => {
console.log("Fetch Server");
}, 1000);
}
function drawUI() {
console.log("Draw UI");
}
fetchServer();
drawUI();
Draw UI
Fetch Server
실행 결과를 통해 fetchServer에서 1초 뒤에 실행할 console.log가 출력하기도 전에 실행 컨텍스트가 삭제 되어, drawUI 실행 컨텍스트가 생성 및 실행되었다는 사실을 알 수 있다.
🔎 이벤트 루프란?
JavaScript에서 비동기 작업을 관리하고 처리하는 핵심 메커니즘(기본적인 원리나 구조)
🔎 콜백함수(callback)란?
다른 함수에 매개변수로 전달되어 그 함수가 실행되는 동안 특정 시점에 호출되는 함수
function a(callback) {
console.log("a");
callback();
}
function b() {
console.log("b");
}
a(b);
function a(callback) {
setTimeout(() => {
console("a");
callback;
}, 0);
}
function b() {
console.log("b");
}
a(b);
// 화살표 함수도 가능 (간단! 화살표 함수가 탄생하게 된 배경?!)
a(() => { console.log("b"); })
function task1(callback) {
setTimeout(() => {
console.log("task1");
callback();
});
}
function task2(callback) {
console.log("task2");
callback();
}
function task3(callback) {
console.log("task3");
callback();
}
function task4(callback) {
console.log("task4");
callback();
}
task1(() => {
task2(() => {
task3(() => {
task4(() => {
console.log("all task completed");
});
});
});
});
🔎 Promise란?
자바스크립트 비동기 작업을 처리하기 위한 객체로, 비동기 작업의 성공 또는 실패를 나타내는 정보 소유
new Promise(function(resolve, reject) {
// 비동기 작업을 수행하는 코드
// 작업이 성공하면 resolve(value) 호출
// 작업이 실패하면 reject(error) 호출
});
Promise의 상태는 3가지 중 하나
const promise1 = new Promise(function (resolve, reject) {
console.log("promise...");
resolve(); // 성공 (fulfilled)
});
const promise2 = new Promise(function (resolve, reject) {
console.log("promise...");
reject(new Error("실패!")); // 실패 (rejected) 인자 삽입 가능
});
이런 식으로 상황에 따라 성공 실패 여부 전달
const promise = new Promise((resolve, reject) => {
console.log("doing something...");
const isSuccess = false;
setTimeout(() => {
isSuccess ? resolve("success") : reject(new Error("no network"));
});
});
promise2
.then((data) => {
// data는 resolve가 받아온 인자
console.log(data);
})
.catch((err) => {
// err는 resolve가 받아온 인자
console.log(err);
})
.finally(() => {
// 받을 수 있는 매개변수 없음
console.log("finally");
});
const getSunIcon = () =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve("🌞");
}, 1000);
});
const getWaterDropIcon = (sun) =>
new Promise((resolve, reject) => {
setTimeout(() => {
// resolve(`${sun} => 💧`);
reject(`${sun}`);
}, 1000);
});
const getPlantIcon = (water) =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${water} => 🌱`);
}, 1000);
});
const getFruitIcon = (plant) =>
new Promise((resolve, reject) => {
setTimeout(() => {
resolve(`${plant} => 🍎`);
}, 10);
});
getSunIcon()
.then((sun) => getWaterDropIcon(sun))
.catch((error) => `${error} => 🌧`)
.then((water) => getPlantIcon(water))
.then((plant) => getFruitIcon(plant))
.then((fruit) => console.log(fruit));