본문 바로가기
javascript

setTimeout + async/await로 sleep

by hjcode 2022. 6. 28.

자바나 파이썬에는 실행을 입력한 시간만큼 멈추는 sleep이나 wait가 있지만
자바스크립트에서는 사용자가 직접 구현해야합니다.
setTimeout이 비슷하지만 아래와 같이 사용하면 예상이랑 다른 결과가 나옵니다.

 

function test(){
  console.log('a');
  setTimeout(() => console.log('time'), 3000);
  console.log('b');
}

// a
// b
// time

 

setTimeout은 비동기로 동작하기 때문에 먼저 실행이 가능한 a, b가 
먼저 콘솔에 찍히고 3초후에 time이 찍힙니다.

 

async/await 사용하면 동기적으로 실행을 하게 할 수 있지만 setTimeout은 Promise를
반환하지 않기 때문에 async/await를 적용해도 제대로 동작하지 않습니다.
a가 찍히고 5초후에 b가 나오지않고 a,b가 순차적으로 바로 찍힙니다.

 

async function test(){
	console.log('a');
 	await setTimeout(() => {}, 5000);
 	console.log('b');
}

 

아래와 같이 Promise를 반환하게 해주면 원하는 결과대로 동작합니다.

 

const sleep = delay => new Promise(resolve => setTimeout(resolve, delay));

async function test() {
	console.log('aa');
	await sleep(3000);
	console.log('bb');
}

 

 

반응형

'javascript' 카테고리의 다른 글

html2canvas CORS 우회하기  (0) 2022.12.11
JSDoc  (0) 2022.08.30
for loop 에서 우선순위 찾기  (0) 2022.06.09
더 깔끔한 조건문 사용하기  (0) 2022.05.12
코딩테스트 - 신규 아이디 추천  (0) 2022.03.07