본문 바로가기
자바스크립트 - Javascript

nodejs / javascript에서 sleep

by devscb 2024. 7. 25.
반응형

javascript에서 sleep 함수 구현

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

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

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

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

Promise 없이 Sleep하기 1

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

{
  "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 부하가 크게 증가할 수 있는 위험이 있습니다.

function sleep(ms)
{
    var start = new Date();
    var current = null;
    do { current = new Date(); }
    while(current-start < ms);
}

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

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

Promise 없이 Sleep하기 3

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

setTimeout(func, ms);

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

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

총평

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

728x90
반응형

댓글