2022. 4. 9. 23:20ㆍJavaScript/김민태의 프론트엔드 아카데미 1
Async, await : 콜백처럼 작동하는 비동기 코드이지만 동기코드의 형식을 가진다.
1. typescript config.json 파일에 라이브러리 추가하기
Async와 await을 사용하기 위해 먼저 해주어야 할 설정이다. 나는 타겟으로 ES6이 설정되어있었기 때문에 이를 라이브러리에서 dom api와 함께 불러주는 코드로 수정했다.
예제


코드
{
"compilerOptions": {
"strict": true,
"module": "CommonJS",
"sourceMap": true,
// target을 제외하고 lib 라이브러리를 추가하여 async 사용 기반 마련
// "target": "ES6",
"lib": [
"es6",
"dom"
]
}
}
2. 함수 앞에 async를 붙여준다.
async가 붙은 함수는 비동기함수가 되며, return 값으로 promise 객체를 갖는다. 따라서 promise 를 위의 형식과 같이 리턴값에 감싸줄 필요가 있다.
async request <AjaxResponse> (cb: (data:) => void) : Promise <AjaxResponse> {}
예제


코드
async request<AjaxResponse>(): Promise<AjaxResponse> {
fetch(this.url)
.then(response => response.json())
.then(cb)
.catch(()=>{
console.error('오류');
});
}
}
3. await 붙여주기
기존에 url 주소를 fetch 에 담아 then 으로 하나씩 콜백해주었다면, async 함수가 된 request 내에서 fetch 앞에 await을 붙이고 response에 담아 동기적인 형식을 취하고, 이를 그대로 반환하는 코드로 간단하게 바꿀 수 있다.
단 형식은 동기적이나, async와 await의 작동은 promise 기반의 비동기적 코드가 맞다.
const 변수명 = await 주소담을함수(url주소) ;
예제


코드
async request<AjaxResponse>(): Promise<AjaxResponse> {
const response = await fetch(this.url);
return await response.json() as AjaxResponse;
}
4. 프로그램 내에서 URL 사용하는 부분도 마찬가지로 수정
await로 변수에 담을 URL을 지정한 코드가 있다면 그 코드를 사용하는 함수도 비동기여야하기 때문에 앞에 async를 붙여준다.
함수명 = async (타입) : pomise <리턴값> => {함수}
참고로, 아래의 render함수처럼 promise를 리턴하지 않는 경우라도 async를 붙여 비동기함수를 만든다면 리턴값 타입 지정 부분을 promise로 감싸주어야한다.
예제


코드
render = async (id: string): Promise<void> => {
const api = new NewsDetailApi(id);
const { title, content, comments } = await api.getData();
this.store.makeRead(Number(id));
this.setTemplateData('currentPage', this.store.currentPage.toString());
this.setTemplateData('title', title);
this.setTemplateData('content', content);
this.setTemplateData('comments', this.makeComment(comments));
this.updateView();
}
요약
비동기화를 이용하면서 동기적으로 코드를 짜려면 async와 await을 활용하면 된다.
먼저 config 파일에서 라이브러리를 통해 ES6과 DOM을 부른다.
다음으로, 주소 등의 api 관련 파일에서 async 함수명 promise <리턴값>의 형식으로 수정한 후 await으로 url을 받는다.
마지막으로, api를 받거나 사용하는 다른 모든 코드들에서 함수를 async로 바꾸고 리턴값이 없더라도 promise로 감싼다.
code reference: 김민태의 프론트엔드아카데미 4-10강, 패스트캠퍼스
'JavaScript > 김민태의 프론트엔드 아카데미 1' 카테고리의 다른 글
| 프로그래밍언어 공부법, 학습전략 (0) | 2022.02.21 |
|---|---|
| Node Js 와 NPM (0) | 2022.02.21 |
| JavaScript 마크다운, 템플릿 활용 (0) | 2022.02.13 |
| 개발자도구(F12)로 웹사이트 HTML 문서 수정하는 방법 두 가지 (0) | 2022.02.04 |
| Javascript 그리고 Typescript (0) | 2022.01.31 |