[JavaScript] 비동기 처리(promise, async, await)
처리가 오래 걸리는 요청을 했을 때 JavaScript 는 기본적으로 싱글스레드 환경에서 동작하기 때문에
요청이 완료될때 까지 기다립니다.
Aug 30, 2024
처리가 오래 걸리는 요청을 했을 때 JavaScript 는 기본적으로 싱글스레드 환경에서 동작하기 때문에
요청이 완료될때 까지 기다립니다.
그렇게 되면 모든 요청이 돌아올 때 까지 화면이 랜더링 되지 않습니다.
function download() {
const xhr = new XMLHttpRequest();
xhr.open("GET", "http://localhost:8080/test", false); // false는 동기 요청을 의미함
xhr.send();
return xhr;
} // 랜더링 100년걸림
위 코드에서
XMLHttpRequest
의 open
메서드에 false
를 두 번째 인수로 전달하여 동기 요청을 합니다.
이렇게 되면 요청이 완료될 때까지 JavaScript의 실행이 블록(block)되고, 그동안 UI도 멈추게 됩니다.
Fetch와 Promise
이 문제를 해결하기 위해 우리는 비동기 요청을 사용할 수 있습니다.
fetch
함수는 비동기적으로 HTTP 요청을 보냅니다.
최종 결과를 반환하는 것이 아니고, 미래의 어떤 시점에 결과를 제공하겠다는 '프로미스(promise)'를 반환합니다.
따라서, 요청이 완료될 때까지 기다리지 않고, 다른 작업을 계속 수행할 수 있습니다.let response = fetch("http://localhost:8080/test"); // fetch는 Promise를 반환
Promise
의 상태- 대기(pending): 이행하지도, 거부하지도 않은 초기 상태.
- 이행(fulfilled): 연산이 성공적으로 완료됨.
- 거부(rejected): 연산이 실패함.
Async/Await를 사용한 비동기 처리
fetch
와 함께 async/await
를 사용하면 비동기 요청을 더 직관적으로 다룰 수 있습니다.
async
함수 내에서 await
키워드를 사용하면 Promise
가 해결될 때까지 기다렸다가, 그 결과를 반환받을 수 있습니다.
async function download() {
let response = await fetch({
method: "get",
url: "http://localhost:8080/test"
});
} //값이 오는상태
async function download() {
let response = await fetch("http://localhost:8080/test");
let data = await response.json();
$("#root").append(`<div>${data.body}</div>`);
}
Promise
와 async/await
는 모두 비동기 작업을 처리하고 있습니다.
이 둘의 차이는 무엇이 있을까요?Promise와 async/await의 차이점
- Promise
Promise를 사용한 코드는
.then()
과 .catch()
체인을 사용합니다.fetch("http://localhost:8080/test")
.then((response) => response.json())
.then((data) => {
console.log(data);
// 데이터 처리 로직
})
.catch((error) => {
console.error("Error:", error);
});
- async/await
async/await
는 비동기 함수 호출마다 await
키워드를 사용하여 Promise
가 해결될 때까지 기다리게 하고, 에러 처리도 try...catch
블록을 사용하여 처리합니다async function fetchData() {
try {
const response = await fetch("http://localhost:8080/test");
const data = await response.json();
console.log(data);
// 데이터 처리 로직
} catch (error) {
console.error("Error:", error);
}
}
fetchData();
Share article