다만, 이 코드는 setInterval을 사용하므로 CPU 소모량이 클 수 있다.
- 소스코드
function AWS(limit, secs){ this.list = []; this.limit = limit; this.window = secs*1000; this.push = function(a, b){ this.list.push([-1, a, b]); } this.pop = function(){ if(this.list.length==0) return "EMPTY"; var now = new Date().getTime(); var st = -1; for(var i = 0 ; i < this.list.length; i++){ if(this.list[i][0]<0){ st = i; break; } } if(st == -1) return "EMPTY"; var windowStart = now - this.window; var cnt = 0; for(var i = st - 1; i >= 0; i--){ if(this.list[i][0] < windowStart){ this.list.splice(0, i+1); st -= i+1; break; } cnt++; } if(cnt > this.limit) return "LIMIT EXCEED, REMAINS : "+(this.list.length-st); this.list[st][0]=now; var result = this.list[st]; return result; } }
왜 AWS이냐면, 맨 처음 Window로 선언해서 var window = new Window()로 하니 개발자 모드에서 계속 기존 오브젝트와 겹쳐서 awindow쓰다가 그냥 AWS로 붙여버렸다. - 사용 방법
var limits = 6; //횟수 var limitTime = 1; // 초당 제한 var aws = new AWS(limits, limitTime); aws.push(함수이름, 매개변수);setTimeout(function(){ var result = aws.pop(); if(typeof(result)!='string'){ result[0](result[1]); } }, limitTime*1000/limits); // ex) // function a(b,c,d){ // console.log(b*c+d); // } // aws.push(a,[b,c,d]); // // 혹은 기존 함수들이 존재한다면 // // function _a(b,c,d){ // console.log(b*c+d); // } // function a(b,c,d){ // aws.push(_a,[b,c,d]); // }
값을 스트링으로 한 이유는, 로그 찍어보려고 한것이고, 원한다면 undefined로 바꾸어서 if(result) 형태로 써도 무방하다.
추가적으로 너무 setInterval의 값이 적으면 CPU 사용이 폭증한다. 별로 CPU 리밋도 적고, 크게 코드 값어치가 없다 싶으면 이용하자.
'프로그래밍 > HTML, Javascript, CSS' 카테고리의 다른 글
[JS] Javascript를 이용하여 HTML 주석 지우기 / 숫자 콤마 넣기 (0) | 2019.03.28 |
---|---|
[JS] CORS 이슈 Access-Control-Allow-Origin 문제 해결하기 (0) | 2019.03.28 |
[JS] 구글 맵을 이용하여, 주소를 Geolocation(위도, 경도)로 바꾸기 (0) | 2019.03.28 |
[자바스크립트] Associative array 정렬하기 (0) | 2019.03.11 |
[자바스크립트] Node.js, 자바스크립트 Object(Associative array) 종료 및 콜백 (1) | 2019.03.10 |