Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
Tags
- social distancing
- 모바일 버전만들기
- Spring Security
- 18881번
- 일해라 개발자
- 반응형 웹
- 베리어블 폰트
- 18877번 Social Distancing
- VUE
- 18877번
- CSS
- async
- BOJ Social Distancing
- spring boot
- vue.js
- BOJ 18881
- 텐서플로맛
- Catholic univ Computer Programming Contest
- 백준 BOJ
- BOJ 18877
- 백준 18877번
- BOJ Social Distancing II
- await
- 백준 Social Distancing II
- BOJ
- java
- Social Distancing II
- JavaScript
- CCPC
- 백준
Archives
- Today
- Total
나아가는 길에 발자국을 찍어보자
[setTimeout + async + await ] setTimeout은 프로미스를 반환하지 않아 본문
javascript && vue.js
[setTimeout + async + await ] setTimeout은 프로미스를 반환하지 않아
NAWIN 2020. 12. 17. 13:26반응형
개발을 진행하다가 setTimeout
을 사용할 일이 생겼다.
하나의 서비스가 돌아가고 결과를 표시하는 과정이었는데,
데이터 자동 추출 프로그램인 외부 프로그램을 돌려서 응답을 기다려야 했기에(최대 예상 시간 2분)
최대 2분동안 데이터를 받아올 때까지 기다려야 했다. 그전에 받아오면 바로 표시한다.
따라서 javascript
내에 setTimeout
을 사용해 지연과 요청을 반복하여 2분동안 데이터를 받아올 수있는지 확인해보기로했다.
아이디어까지는 문제가 되지 않았다.
하지만 구현에서 분명 비동기임을 인식하고 지연과 axios
요청에 async
과 await
를 제대로 붙였음에도
동기적으로 실행되지 않더라.....
<문제 인식>
-
setTime
에await
가 제대로 기능하지 않는다. -
처음 시도한 코드
if(type === 'auto'){ this.uploadingStart() await setTimeout(function () {},10000) this.uploadingEnd() }
- 처음에
uploadingStart()
이 시작하면 아래의 돌아가는 로고가 생기고 10초 뒤 사라지게 하고 싶었다. - 하지만 시작하자마자 바로 사라지고 그 다음에
setTimeout
이 끝났다.
- 처음에
<결과>
그래서 찾아본 결과 아래의 글을 보면서 이해가 됐다.
https://stackoverflow.com/questions/33289726/combination-of-async-function-await-settimeout
https://dev.to/francisprovost/await-a-settimeout-1fje
setTimeout
은 Promise
반환을 하지 않기 때문에 async
와 await
를 적용해도 동기적으로 적용되지 않는다고 한다.
따라서 Promise
를 반환하게 직접 작성 후 async
와 await
를 적용해야한다고 한다.
- 적용 코드
const wait = (timeToDelay) => new Promise((resolve) => setTimeout(resolve, timeToDelay)) //이와 같이 선언 후
this.uploadingStart()
await wait(5000) // 이렇게 await와 함께 사용하면 동기적으로 동작한다.
this.uploadingEnd()
- 실제 적용 사례
- 이렇게 요청하고 응답에 따라 지연 후 다시 요청하는 방식으로 2분동안 진행하게 하였다. (물론 응답 시에는 바로 나오게 된다.)
if (type === 'auto') {
const wait = (timeToDelay) => new Promise((resolve) => setTimeout(resolve, timeToDelay))
This.uploadingStart()
let time = 24
while (time--) {
await ajax( ... )
.then( ... )
.catch( ... )
await wait(5000)
}
반응형
'javascript && vue.js' 카테고리의 다른 글
<imput type=file>에 파일 형식 지정하기 (0) | 2020.12.17 |
---|---|
Axios GET요청에는 Body가 없다 (0) | 2020.10.06 |
[javascript] async && await (1) | 2020.10.06 |
Javascript 비동기적 동작 정리 (0) | 2020.10.06 |
[Vue warn]: Failed to mount component: template or render function not defined. 에러 (0) | 2020.08.18 |
Comments