๊ณ ์ฐจ ํจ์.
๋ญ์ง ์ด ๊ต์ฅํ ์ด๋ ค์ธ ๊ฒ๋ง ๊ฐ์ ์ด๋ฆ์..?
์ซ์ง ๋ง์!
์ฌ์ค ๊ณ ์ฐจ ํจ์๋ ์ด๋ฏธ ์ฐ๋ฆฌ๊ฐ ๋ฐฅ ๋จน๋ฏ์ด ์ฌ์ฉํ๊ณ ์๋ค.
๋จ์ง ์ ์ฉ์ด๊ฐ ์์ํ ๋ฟ..(๋๋ง ๊ทธ๋ด์๋)
๊ทธ๋ผ ๊ณ ์ฐจ ํจ์๋ฅผ ํํค์ณ๋ณด์.
๊ณ ์ฐจ ํจ์๋?
- ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋ ํจ์
- ํจ์๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ ํจ์
ํจ์๋ฅผ ์ธ์๋ก ๋ฐ๋๋ค ..?
๋๋ฌด ์ต์ํ์ง ์๋์?
const getUsersName = data.map(({name}) => name)
map ๋ฉ์๋๋ ์ธ์๋ก ์ฝ๋ฐฑ ํจ์๋ฅผ ๋ฃ์ด์ค๋ค.
์ด? ํจ์์ ์ฝ๋ฐฑ ํจ์๋ฅผ ์ธ์๋ก ๋ฃ์๋ค? ์! map๋ ๊ณ ์ฐจ ํจ์๊ตฌ๋~
๋ญ์ผ ๋ณ๊ฑฐ ์๋๋ค.
ํ์ง๋ง ๋ด๊ฐ ์ค๋ ์ด ๊ธ์ ์ด ์ด์ ..
๋ฐ๋ก ํจ์๋ฅผ ๊ฒฐ๊ณผ๋ก ๋ฐํํ๋ ํจ์์์ ๋ช ์๊ฐ์ ํค๋งธ๊ธฐ ๋๋ฌธ์ด๋ค.ใ
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
<script src="./test.js" defer></script>
</head>
<body>
<input type="text" />
<div>
<span>default : </span>
<span id="default"></span>
</div>
<div>
<span>throttle : </span>
<span id="throttle"></span>
</div>
</body>
</html>
document.querySelector('input').addEventListener('input',(e) => {
const { value } = e.target;
document.getElementById('default').innerText = value;
throttle(value);
})
let isThrottling;
const throttleFunc = (cb, delay) => {
if (isThrottling) return;
isThrottling = true;
return (...args) => {
setTimeout(() => {
cb(...args);
isThrottling = false;
}, delay);
};
};
const throttle = throttleFunc((value) => {
document.getElementById('throttle').innerText = value;
},1000);
์ฐ๋กํ๋ง ํจ์๋ฅผ ๊ตฌํํด ๋ณด๊ณ ์์๋ค.
<๋ด๊ฐ ์ํ๋ ๋์>
- ๋งค๊ฐ๋ณ์ delay๋ก ์ค์ ํ ์๊ฐ(์ฌ๊ธฐ์๋ 1์ด)์ด ์ง๋๋ฉด innerText๋ฅผ ์ฑ์ด๋ค.
- 1์ด๊ฐ ์ง๋๊ธฐ ์ ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด ๋ฌด์ํ๋ค.
- 1์ด๊ฐ ์ง๋์ผ๋ง innerText๋ฅผ ์ฑ์ด๋ค.
์ด๊ฑด๋ฐ, ํ ์คํธ๋ฅผ ํด๋ณด๋ฉด ๋ฌํ๊ฒ ๊ทธ๊ฒ ์๋ ๊ฑฐ ๊ฐ์๋ฐ..
๊ทธ๋ฅ 1์ด๋ง๋ค ์ด๋ฒคํธ๋ฅผ ์คํํ๋ ๊ฑฐ ๊ฐ๋ค๋ ๋๋์ด ๋ค์๋ค.
<๋์ ์๊ฐํ๋ก>
- ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ฉด throttle(value)๊ฐ ํธ์ถ๋๊ฒ ์ง.
- ๊ทธ๋ฌ๋ฉด throttle์ throttleFunc๊ฐ ํ ๋น๋ผ ์์ผ๋๊น ์๊ฐ ๋งค๋ฒ ์คํ์ด ๋๊ฒ ๊ตฌ๋.
- ์ ์ญ์ ์ ์ธ๋ isThrottling์ ์ต์ด์ ๊ฐ์ undefined๋๊น ์ฒซ ๋ฒ์งธ ์ฝ๋๋ ๊ฐ๋ณ๊ฒ ๋ฌด์ํ๊ณ ~
- ๋ค์ ์ค์์ isThrottling์ด true๋ก ํ ๋น๋๊ฒ ๊ณ
- ๊ทธ๋ค์ ์ด์ ํ์ด๋จธ๊ฐ ์ค์ ๋๊ฒ ๋ค
- 1์ด๊ฐ ์ง๋๋ฉด ์ฝ๋ฐฑ ํจ์์ ๊ฐ์ ์ ๋ฌํด ์ฃผ๊ณ isThrottling์ด ๋ค์ false๊ฐ ๋๋๊น ๊ทธ๋ค์ ๋์๋ ์ ์ํํ๊ฒ ์ง!
- ๋ง์ฝ 1์ด๊ฐ ์ง๋๊ธฐ ์ ์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด์ throttleFunc๊ฐ ๋ ์คํ์ด ๋๋ฉด
- ์๊น isThrottling์ด true๋ก ํ ๋น๋์ผ๋๊น ( ์์ง ์ด๋ฒคํธ ์ข ๋ฃ ์ ์ด๋ผ false๊ฐ ์๋๊ณ )
- ์ฒซ ๋ฒ์งธ ์ค if๋ฌธ์์ return๋๋๊น ์ถ๊ฐ์ ์ผ๋ก ์ด๋ฒคํธ ์คํ์ด ์ ๋ ๊ฑฐ์ผ.
- ๋๋ค. ์๋ฒฝํ ๊ตฌํ์ด์ผ!
๋ ๋ฌด์จ..^^
๋ญ๊ฐ ์ด์ํด์ throttleFunc๋ด๋ถ์ isThrottling์ ์ฝ์๋ก ์ฐ์ด๋ณด์๋ค.
๋ญ์ง..? ์๋ก๊ณ ์นจ ํ์ ๋ ํ ๋ฒ๋ง ์ฝ์์ด ์ถ๋ ฅ๋๊ณ
๊ทธ ์ดํ์๋ ์๋ฌด๋ฆฌ input์ ์ ๋ ฅํด์ event๋ฅผ ๋ฐ์์์ผ๋ ์ฝ์์ด ์ ์ฐํ๋ค.
์ฆ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํด๋ ์ ์ชฝ์ด ์คํ๋์ง ์๋๋ค๋ ๊ฑด๋ฐ..?
์ด ๋ถ๋ถ์์ ์์ ์ธ๊ธํ ์ ๊ณผ์ ์ด ๋ง๋ ๊ฑฐ ๊ฐ์๋ฐ ๋ญ๊ฐ ๋ฌธ์ ์ผ๊น, ์ ์ ํจ์๋ฅผ ์ ํ๊น๋ฅผ ์ ๋ง ์ค๋ ์๊ฐ ๊ณ ๋ฏผํ๋ค..
throttle์ ์ฝ์์ ์ฐ์ด๋ดค๋๋ฐ ๋ด์ฉ์ ์ ๋๋ก ์ฝ์ด๋ณด์ง๋ ์๊ณ ํจ์๊ฐ ๋์ค๊ธธ๋
๊ทธ์น ํจ์๊ฐ ๋์ค์ง ํจ์๋ฅผ ํ ๋นํ์ผ๋๊น.
ํ๊ณ ๋์ด๊ฐ๊ธฐ๋ ํ๊ณ ..^^(๋ฐ๋ณด)
๊ทธ๋ฌ๋ค๊ฐ ๋ฐ๊ฒฌํ๋ค.
์ด? throttle์ด throttleFunc์ return ๋ถ๋ถ๋ง ๋ฐ๋ค?
์!! throttleFunc()์ ํํ์๊ตฌ๋!!
๊ทธ๋ฌ๋๊น ํจ์์ ์คํ ๊ฒฐ๊ณผ๋ฅผ ๋ฐ์์ throttle์ ํ ๋นํ ๊ฒ์ด์๋ค!
๋ฐ๋ผ์ throttleFunc๊ฐ returnํ ๋ถ๋ถ๋ง throttle์ ํ ๋น๋ ๊ฒ์ด๊ณ
์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค return๋ถ๋ถ์ด ์ฌ์คํ ๋๋ ๊ฒ์ด๋ค.
์ฝ์์ด ์ต์ด ์ดํ์ ์ ์ฐํ๋ ์ด์ ๋ฅผ ์ฐพ์๋ค.
์ต์ด์๋ throttleFunc์ ๋ฐํ๊ฐ์ด throttle์ ํ ๋น๋์ด์ผ ํ๊ธฐ ๋๋ฌธ์
throttleFunc๊ฐ ์คํ์ด ๋ ๊ฒ์ด๋ค. ์ฌ๊ธฐ์ ์ฝ์์ด ์ถ๋ ฅ๋๋ ๊ฒ์ด๋ค.
๊ทธ๋ฆฌ๊ณ ๊ฐ์ด ๋ฐํ๋ ์ดํ์๋ throttleFunc๊ฐ ์คํ๋๋ ๊ฒ์ด ์๋๊ณ
throttle์ ํ ๋น๋ throttleFunc์ return๋ถ๋ง ์คํ๋๊ธฐ ๋๋ฌธ์ ์ฝ์์ด ์ถ๋ ฅ๋์ง ์๋ ๊ฒ์ด์๋ค.
๋ฌํ๊ฒ ๋์์ด ์ด์ํ๋ค๊ณ ์๊ฐํ๋ ๋ถ๋ถ๋ ์์ธ์ ์์๋๋ค.
if (isThrottling) return;
isThrottling = true;
throttleFunc ๋ด๋ถ์ ์ด ๋ ์ค์ด return๋ฌธ ๋ฐ์ ์์ด ๋์ํ์ง ์์๋ค.
๊ทธ๋์ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋๋ง๋ค ํ์ด๋จธ๊ฐ ๋ง์ถฐ์ง ๊ฒ์ด๊ณ
๊ฒฐ๊ตญ 1์ด๊ฐ ์ง๋์ง ์์์ด๋ ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ๋ค๋ฉด ๊ณ์ setTimeout์ด ์คํ๋๊ณ ์์๋ ๊ฒ์ด๋ค.
์ ๋๋ก ๋์ํ ์ ์๊ฒ ์ฝ๋๋ฅผ ์๋์ ๊ฐ์ด ์์ ํ์๋ค.
const throttleFunc = (cb, delay) => {
let isThrottling = false;
return (...args) => {
if (isThrottling) return;
isThrottling = true;
setTimeout(() => {
cb(...args);
isThrottling = false;
}, delay);
};
};
์ด๋ฐ ๊ตฌ์กฐ๊ฐ (๋์๊ฒ๋) ์์ํด์ ํค๋งธ๋๋ฐ,
์ด๋ ๊ฒ ํจ์๋ฅผ ๋ฐํํ๋ ํจ์๋ ์๋ค๋ ๊ฒ์ ์๊ฒ ๋์๋ค.
๊ทธ๋ฆฌ๊ณ ๋ ์ด๋ฐ ๊ณ ์ฐจํจ์๋ฅผ ์ด๋ป๊ฒ ๋ถ์ํ๋ฉด ๋๋์ง๋ ๋ฐฐ์ธ ์ ์๋ ์๊ฐ์ด์๋ค!