ํฐ์คํ ๋ฆฌ ๋ทฐ
๊ฒ์์ด๋ฅผ ์ ๋ ฅํ๋ ๋์์ ์ํฐํค, ๊ฒ์ ๋ฒํผ์ ๋๋ฅผ ํ์ ์์ด ๊ฒฐ๊ณผ๊ฐ์ ์ฆ์ ๋ฐ์ํ ์ ์๋๋ก ๋ค์๊ณผ ๊ฐ์ด ๊ตฌํํ์๋ค.
const dispatchEvent = debounce((targetText) => {
this.callback(targetText);
}, this.delayTime);
this.textinputElement.addEventListener('keyup', (event) => {
dispatchEvent(event.target.value);
});
keyup ์ด๋ฒคํธ ํธ๋ค๋ฌ๋ฅผ Input ์์์ ๋ฑ๋กํด์ฃผ๊ณ ์ด๋ฒคํธ ๋ฐ์ ์ ๊ด๋ จ ํจ์๋ฅผ ํธ์ถํด์ฃผ๋๋ก ํ์๋ค.
RxJS debounce operator
์์ ๊ฐ์ ๊ธฐ๋ฅ์ RxJS๋ฅผ ํตํด ๋ฆฌํฉํ ๋งํ์๋ค.ํ ์์ค ์์์๋ ์ฒ๋ฆฌํด์ผ ๋ ๋น๋๊ธฐ ์์ ์ด ๋ง์ง ์๊ธฐ ๋๋ฌธ์ ํฌ๊ฒ ์๊ด์ ์์ง๋ง, ์ข ๋ ๋ช ํํ๊ณ ํจ์จ์ ์ผ๋ก ์ฝ๋๋ฅผ ์์ธกํ ์ ์๋๋ก ๋ค์์ ๋น๋๊ธฐ ์์ ์ ์ฒ๋ฆฌํ ๊ฒฝ์ฐ์๋ RxJS๋ฅผ ์ฌ์ฉํด ๋ณผ ์ ์๋ค.
RxJS
- RxJS๋ Reactive Extensions For JavaScrpt ๋ผ์ด๋ธ๋ฌ๋ฆฌ
- RxJS๋ ์ด๋ฒคํธ ์คํธ๋ฆผ์ Observable ์ด๋ผ๋ ๊ฐ์ฒด๋ก ํํํ ํ ๋น๋๊ธฐ ์ด๋ฒคํธ ๊ธฐ๋ฐ์ ํ๋ก๊ทธ๋จ์ ์์ฑ์ ์ฉ์ด์ผ ํจ
Observable
- ์๊ฐ์ ์ถ์ผ๋ก ์ฐ์์ ์ธ ๋ฐ์ดํฐ๋ฅผ ์ ์ฅํ๋ ์ปฌ๋ ์ ์ ํํํ ๊ฐ์ฒด
- ์คํธ๋ฆผ(stream): ํน์ ๊ฐ์ฒด๋ฅผ ๊ด์ฐฐํ๋ Observer์๊ฒ ์ฌ๋ฌ ์ด๋ฒคํธ๋ ๊ฐ์ ๋ณด๋ด๋ ์ญํ ์ ํจ
Observer
- Observable์ ์ํด ์ ๋ฌ๋ ๋ฐ์ดํฐ๋ฅผ ์๋นํ๋ ์ฃผ์ฒด
- ๊ตฌ๋ (Subscription): Observable์ด ๋ฐฐ์ถํ๋ ํ๋ ๋๋ ์ฐ์๋ ํญ๋ชฉ์ ๋ฐ์
- ๋์์ฑ ์ฐ์ฐ์ ๊ฐ๋ฅ์ผ ํจ
Operator
- Observable๋ฅผ ์์ฑ ๋ฐ ์กฐ์ํ๋ ํจ์
- Observable๋ฅผ ์์ฑ ๋ฐ ๊ฐ๊ฐ์ Observable์ ์ฐ๊ฒฐํ๊ธฐ๋ ํจ
- ๋ํธ์ฒด์ด๋: Operator๋ ํ์ฌ Observable ์ธ์คํด์ค ๊ธฐ๋ฐ์ผ๋ก ํญ์ ์๋ก์ด Observable ์ธ์คํด์ค๋ฅผ ๋ฐํ
์ด์ ์๋ Input ํ๊ทธ์ ์๊ฐ์ ์ ํด์ ์ง์ ๋ ์๊ฐ ๋ด์ ์ฌ๋ฌ ๋ฒ ๊ฒ์์ ํ์ฌ value๊ฐ ๋ณ๊ฒฝ๋๋๋ผ๋, debounce ํจ์ ๋ด์ setTimeout์ ํตํด ์๋์ ์ผ๋ก ๋๋ ์ด ์๊ฐ์ ๊ฑธ์ด์ฃผ์ด ์์ฒญ์ ์ง์ฐ์ํค๋๋ก ๊ตฌํํ์๋ค.
์ด๋ฅผ ๋์ ์ ์ด๋ฒ์๋ RxJS operator์ธ debounceTime์ ์ฌ์ฉํ์๋ค.
debounceTime์ output ์ฌ์ด์์ ํน์ ์๊ฐ๋ณด๋ค ์ ์ ์๊ฐ์ ๋ฐฐ์ถ๋ ๊ฐ๋ค์ ๋ฒ๋ฆฐ๋ค.
const eventSource = fromEvent(this.textinputElement, 'keyup')
.debounceTime(this.delayTime); //์ง์ ๋ ์๊ฐ ๋ด์์ observer์์ ๊ฐ์ง๋ฅผ ํ๋๋ผ๋ ํด๋น ๊ฐ์ ๋ฒ๋ฆผ
this.subscription = eventSource.subscribe((event) => {
dispatchEvent(event.target.value);
})
ํ ์์ค ์ฝ๋ ์์์๋ ๊ตฌํ์ด ์๋์ด ์์ง๋ง Input ํ๋์ auto-complete๋ฅผ ๊ตฌํํ ๋ ๋ง์ด ์ฌ์ฉ๋๋ RxJS opserator ์ค์ distinctUntilChanged๊ฐ ์๋ค.
https://www.learnrxjs.io/learn-rxjs/operators/filtering/distinctuntilchanged
Only emit when the current value is different than the last.
distinctUntilChanged๋ ํ์ฌ์ ๊ฐ์ด ๋ง์ง๋ง ์ ๋ ฅํ ๊ฐ๊ณผ ๋ค๋ฅผ ๋๋ง ๊ฐ์ ๋ด๋ณด๋ธ๋ค.
distinctUntilChanged๋ ์ด์ ์ value์ ํ์ฌ value๊ฐ ๋ค๋ฅผ ๊ฒฝ์ฐ์๋ง ํด๋น ๊ฐ์ ์ฒ๋ฆฌํ๋๋ก ํด์ฃผ๋ ์คํผ๋ ์ดํฐ์ธ๋ฐ, ์ฌ๊ธฐ์ ์ ์ํ ์ ์ด ์๋ค.
์ฐ๋ฆฌ๋ ๋ณดํต Input ์์ ๋ด์ ์๋ value ํ๋กํผํฐ๋ฅผ ํตํด์ ํค์๋ ๊ฐ์ ๊ฐ์ ธ์จ๋ค. ์ด๋ ๊ฒ ๋๋ฉด ์ด๋ฒคํธ๊ฐ ๋ฐ์ํ ๋ ๋ง๋ค value ํ๋กํผํฐ๊ฐ ๋ฐ์ธ๋ฉ๋์ด ์๋ event object_์ ์ฒด ์ด๋ฒคํธ์ ๊ฐ์ฒด์ ๋ํ ์ฐธ์กฐ๊ฐ(์ฃผ์๊ฐ)์ ๋งค๋ฒ ๋ฌ๋ผ์ง๊ธฐ ๋๋ฌธ์ distinctUntilChanged๋ฅผ ํตํด ์ํ๋ ๊ฒฐ๊ณผ๋ฅผ ์ป์ ์ ์๋ค(Observable์์ ๋ฐฐ์ถ๋๋ ๊ฐ์ event object ์ ์ฒด์ด๋ค).
์์ ๊ฐ์ ์ฐธ์กฐ๊ฐ์ ์ํ ๋น๊ต ๋์ ์ ์ค์ ๊ฐ์ ์ํ ๋น๊ต๋ฅผ ์ํด์ map operator ์ ์ฌ์ฉํ ์ ์๋ค.
observable
.map(event => event.target.value) //ํ์ฌ ์ด๋ฒคํธ ๊ฐ์ฒด์ ์ค์ ๊ฐ์ผ๋ก
.debounceTime(delayTime)
.distinctUntilChanged()
https://rxjs.dev/api/operators/map
Similar to the well known Array.prototype.map function, this operator applies a projection to each value and emits that projection in the output Observable.
map operator๋ ๋ค๋ฅธ API๋ค๊ณผ ๋์ผํ๊ฒ ๋ฐ์ํ๋ ์์๋ค์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณํํด ์ค๋ค.
๋ฐ์ํ๋ ๊ฐ์ ๋ค๋ฅธ ๊ฐ์ผ๋ก ๋ณํ ๋ฐ ๋์ฒดํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ ํฉํ๋ค.
'JS' ์นดํ ๊ณ ๋ฆฌ์ ๋ค๋ฅธ ๊ธ
setTimeout์ผ๋ก setInterval ๊ตฌํ (0) | 2021.07.18 |
---|---|
pipe operator๋ฅผ ํตํด ์คํผ๋ ์ดํฐ ์ฒ๋ฆฌ (0) | 2021.07.17 |
textContent์ ๊ณต๋ฐฑ ๋ฌธ์ (0) | 2021.07.16 |
auto-complete_๋น๋๊ธฐ ์ฝ๋ฐฑ ํจ์, focusEvent, mouseEvent (0) | 2021.07.16 |
getBoundingClientRect_์์ ์์น ์ก๊ธฐ (0) | 2021.07.14 |