자바스크립트에서 비동기 프로그래밍은 매우 중요한 개념이다. 코드가 순서대로 실행되지 않고, 어떤 작업이 완료되기를 기다릴 필요 없이 다른 작업을 계속 진행할 수 있게 해준다.
동기 동작 순서
setTimeout(() => {
console.log('2초 후 출력');
}, 2000);
console.log('즉시 출력');
이 코드에서 setTimeout
은 비동기 함수로, 지정된 시간이 지나면 콜백 함수를 실행하게 돼. 그러나 setTimeout
이 콜백 함수를 실행하는 동안 다른 코드는 계속 실행되고, 콜백 함수의 실행은 나중에 일어나기 때문에 "즉시 출력"이 먼저 출력되고, "2초 후 출력"은 나중에 출력된다. 이렇게 콜백 함수를 이용해서 비동기 작업을 처리할 수 있기 때문에, 콜백 함수가 비동기 처리와 밀접하게 연관되어 있다.
then
을 사용하여 작업이 성공적으로 완료될 때의 처리를 추가할 수 있다.resolve, reject
resolve
reject
예시:
function sum(num1, num2) {
return new Promise((resolve, reject) => {
if (num1 === null || num2 === null) {
reject(new Error("num1 또는 num2 은 null 이다"));
} else resolve(num1 + num2);
});
}
//sum(10, 20)
//.then((result) => console.log(result)) //30
//.catch((error) => console.error("실패:::" + error));
sum(null, 20)
.then((result) => console.log(result))
.catch((error) => console.error("실패:::" + error));
//실패:::Error: num1 또는 num2 은 null 이다
예시에서 sum
함수는 두 숫자를 더하고 그 결과를 Promise
로 감싸서 반환하고 있다. resolve(num1 + num2)
부분은 Promise를 성공 상태로 만들고 그 값을 반환하게 된다. then
메서드를 통해서 이 Promise가 성공했을 때 실행할 콜백 함수를 지정할 수 있다. 이 예시에서 성공시 결과를 콘솔에 출력하고 있다.
sum
함수에 첫 번째 인수로 null
을 전달하고 있을때는 함수 내부의 조건문에서 reject
가 호출되고 catch
부분으로 이동한다. catch
부분에서는 에러 메시지를 콘솔에 출력한다.
예시:
fetch('url')
.then(response => response.json())
.then(data => console.log(data));
fetch
함수는 지정된 URL로 HTTP 요청을 보내고, 그 응답을 Promise
로 반환한다.
then
에서 응답 객체를 JSON 형식으로 변환한다. response.json()
메서드는 다시 Promise를 반환하기 때문에 체이닝을 계속할 수 있다.then
에서는 변환된 JSON 데이터를 콘솔에 출력한다.fetch
함수를 사용하면 네트워크 응답을 기다리는 동안 다른 작업을 계속할 수 있어서, 사용자 경험을 향상시킬 수 있다.
fetch('url')
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.log('에러 발생:', error));
async
와 await
키워드를 사용하면 비동기 코드를 마치 동기 코드처럼 읽고 쓸 수 있다.await
는 프로미스가 완료될 때까지 기다리며, 그 결과를 반환한다.async: 동기
await: 기다리다
try ~ catch: 에러 발생 시 핸들링
async function calculateSum(num1, num2) {
const promise = new Promise((resolve, reject) => {
if (num1 === null || num2 === null) {
reject(new Error("num1 또는 num2 은 null 이다"));
} else {
resolve(num1 + num2);
}
});
try {
const result = await promise;
console.log(result);
} catch (error) {
console.error("실패:::" + error);
}
}
calculateSum(10, 20); //30
async function fetchData() { //1.비동기 처리
try {
const response = await fetch('url'); //2. 처리 기다림
const data = await response.json(); //3.처리 기다림
console.log(data);//4. 처리 후 실행 코드
} catch (error) {
console.log('에러 발생:', error);
}
}
비동기 프로그래밍은 자바스크립트의 핵심 부분이며, 위에 설명된 여러 가지 방법으로 처리할 수 있다. 각 방법은 상황과 필요에 따라 선택하면 될 것이다.