내일배움캠프 멘토링 시간에서 멘토님께서 온도계 문제라는 과제를 내어 주셨다. 다음과 같은 조건을 가지는 함수를 작성하면 된다.
- 매 1분마다 실행되는 함수 생성
- 함수는 호출될때마다 온도 값이(num) 인풋된다
- 함수는 호출될때마다 지금까지 받은 온도의 평균 온도 값을 내보낸다.
- 호출은 무한으로 호출된다.
- 디비에 값 저장 불러오기 X
- 자바스크립트 또는 타입스크립트로 실행
- setInterval로 실행되도 무관, 혹은 cronjob이 실행시킨다고 가정해도 무방
const Thermometer = (() => {
let sum = 0;
let length = 0;
let interval = null;
// 온도를 더한 뒤 평균을 알려줍니다.
const getAverage = (temp) => {
sum += temp;
length++;
const avg = sum / length;
console.log(`${new Date().toLocaleTimeString()} - 현재 평균 온도는 : ${avg}`);
return avg;
};
// 현재 온도를 어디선가 가져옵니다...
const getCurrentTemperature = () => {
const temperature = Math.random() * 100;
return temperature;
};
// 00초 부터 시작됩니다.
const start = (intervalTime = 60000) => {
if (!interval) {
const now = new Date();
setTimeout(
() => {
interval = setInterval(() => {
getAverage(getCurrentTemperature());
}, intervalTime);
},
59000 - now.getSeconds() * 1000
);
}
};
const close = () => {
if (interval) {
console.log("타이머를 종료합니다.");
clearInterval(interval);
interval = null;
}
};
return {
start,
close,
};
})();
// Thermometer.start();
Thermometer.start(1000); // 테스트용 1초 간격 실행
우선 클로저를 이용하여 어디서 호출하더라도 같은 값을 볼 수 있도록 했고, 함수를 실행하는데 필요한 start, close 메서드만 내보냈다.
또한 단순히 평균값만 내보내면 되므로 굳이 들어오는 온도 값들을 저장하지 않고 평균을 계산하는데 필요한 sum과 length 만 업데이트 해주는 방향으로 했다.