JavaScript async/await
수정하기
문서 생성 2021-12-08 22:45:53 최근 수정 2022-12-24 13:20:40
비동기 코드를 동기적인 코드처럼 작성하기 위해 ES8부터 async/await가 도입되었다.
(async function() {let contents = await readFile("config.json");doSomethingWith(contents);console.log("DONE");});
async 함수
async함수는async키워드를 사용해 정의한다.async함수는 언제나 프로미스를 반환한다. (명시적으로 반환하지 않으면 암묵적으로 반환값을resolve하는 프로미스를 반환한다.)await키워드는async함수 내부에서 사용해야 한다.
await 키워드
await키워드는 프로미스가 비동기 처리가 수행된 상태(settled)가 될 때까지 기다리다가 수행된 상태가 되면 프로미스가resolve한 처리 결과를 반환한다.await키워드는 반드시 프로미스 앞에 사용해야 한다.- 비동기 처리가 서로 연관된 것이 아니면 모든 프로미스에
await을 사용하는 것은 주의해야 한다. 대신Promise.all을 사용하는 것이 좋다.
에러 처리
const getData = async() => {try {const url = 'https://something.wrong';const response = await fetch(url);const data = await resonse.json();console.log(data);} catch (err) {console.error(err);}};getData();
async/await에서 에러 처리는try...catch문을 사용할 수 있다.async함수 내에catch문을 사용해 에러처리를 하지 않는 경우엔async함수는 발생한 에러를reject하는 프로미스를 반환한다. 함수 호출 후에catch메서드를 사용해 에러를 캐치할 수 있다.
async/await가 메인 스레드를 차단하는 것일까?
나와 비슷한 생각을 하는 사람이 있었는지 글 을 하나 발견할 수 있었다.
비동기 프로그래밍에 대해 학습하고 나니 이상하게 헷갈렸다.
바로 "async/await을 사용하면 "동기"처럼 작동하니, 메인 스레드를 블로킹하고 있지 않을까?" 하는 점이다.
왜냐하면 다음 코드의 결과를 생각했을 때, 첫 번째 응답을 받을 때까지 두 번째 요청의 실행을 막는 것처럼 느꼈기 때문이다.
async function getUserData(){let response1 = await fetch('https://jsonplaceholder.typicode.com/users');let response2 = await fetch('https://jsonplaceholder.typicode.com/users');let response3 = await fetch('https://jsonplaceholder.typicode.com/users');}getUserData();
그런데 다음 코드를 보고 나니 바로 의문이 풀렸다.
async function getUserData(){let response1 = await fetch('https://jsonplaceholder.typicode.com/users');let response2 = await fetch('https://jsonplaceholder.typicode.com/users');let response3 = await fetch('https://jsonplaceholder.typicode.com/users');console.log("모든 promise 실행 후");}getUserData();console.log("Hello World");
getUserData에 적힌 모든 promise 실행 후가 출력되기 전에 Hello World가 출력된다.
async/await은 비동기 처리를 동기처럼 보이게 하는 "문법적 설탕"일 뿐이었다. 혼동하지 말자!!
``
reference
- 김두형·정재훈 역, 니콜라스 자카스 저, 《모던 자바스크립트》, 인사이트, 2017년
- 이웅모 저, 《모던 자바스크립트 Deep Dive》, 위키북스, 2020년
