0%

nodejs / javascript에서 sleep

javascript

javascript에서 sleep 함수 구현

javascript에는 sleep함수가 없어서, 직접 구현해서 사용해야합니다.
sleep 함수를 구현하는 법은 다음과 같습니다.

1
2
3
4
5
6
//ms micro sec만큼 대기
async function sleep(ms) => {
return new Promise(resolve=>{
setTimeout(resolve,ms)
});
}

사용법은 다음과 같이 sleep 함수 앞에 await를 붙여서 써 줍니다.

1
2
3
console.log('sleep 수행 전');
await sleep(1000);
console.log('1초 후에 실행결과출력');

Promise 없이 Sleep하기 1

오래된 자바스크립트 버전 (ecma6 이전)에서는 Promise를 쓸 수 없습니다.
이럴 때 대안 첫번째는 babel을 사용하는 것입니다.
아래와 같이 package.json설정을 하고, npm run build로 앞서 작성한 javascript 코드를 빌드하여 사용할 수 있습니다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
{
"name": "test",
"version": "1.0.0",
"description": "",
"main": "index.js",
"scripts": {
"build": "babel src -d dist"
},
"author": "",
"license": "ISC",
"dependencies": {},
"devDependencies": {
"@babel/cli": "^7.10.3",
"@babel/core": "^7.10.3",
"@babel/preset-env": "^7.10.3"
}
}

Promise 없이 Sleep하기 2

또 다른 방식은 아래와 같이 while looping을 하는 방식이 있습니다.
다만 이 방식은 cpu 부하가 크게 증가할 수 있는 위험이 있습니다.

1
2
3
4
5
6
7
function sleep(ms)
{
var start = new Date();
var current = null;
do { current = new Date(); }
while(current-start < ms);
}

사용법은 아래와 같습니다.

1
2
3
console.log('sleep 수행 전');
sleep(1000);
console.log('1초 후에 실행결과출력');

Promise 없이 Sleep하기 3

또 다른 방식은 setTimeout에 function을 넘겨주는 방식입니다.

1
setTimeout(func, ms);

사용법은 아래와 같습니다.
이 방식은 sleep을 여러번 하면 depth가 깊어져 코드를 읽기가 힘들어지는 단점이 있습니다.

1
2
3
4
console.log('sleep 수행 전');
setTimeout(function(){
console.log('1초 후에 실행결과출력');
},1000);

총평

javascript에서 기본적으로 sleep을 제공해주었으면 좋겠네요.
많은 사람들이 물어봄직하고, 다른 언어들에서는 기본 api 로 제공하는데 왜 javascript는 지원을 안하는지 의아합니다.