[ReactiveX]Observable 만드는 방법 5가지 방법
1. 배열을 반환하는 옵저버블
of()
of를 사용하여 1,2,3,4,5를 발행하는 옵져버블 obs1$를 생성하여 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { of } = rxjs
// const of = rxjs.of -> 위 코드와 같은 코드
const obs1$ = of(1, 2, 3, 4, 5)
obs1$.subscribe(item => console.log(`of: ${item}`))
<console>
“of: 1”
“of: 2”
“of: 3”
“of: 4”
“of: 5”
from()
from를 사용하여 6,7,8,9,10이 들어가있는 배열을 각각 발행하는 옵져버블 obs2$를 생성하여 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { from } = rxjs
// const from = rxjs.from -> 위 코드와 같은 코드
const obs2$ = from([6, 7, 8, 9, 10])
obs2$.subscribe(item => console.log(`from: ${item}`))
<console>
“from: 6”
“from: 7”
“from: 8”
“from: 9”
“from: 10”
range()
range를 사용하여 11에서 5개의 범위 안에 있는 숫자 11,12,13,14,15를 발행하는 옵져버블 obs3$를 생성하여 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { range } = rxjs
// const range = rxjs.range -> 위 코드와 같은 코드
const obs3$ = range(11, 5)
obs3$.subscribe(item => console.log(`range: ${item}`))
<console>
“range: 11”
“range: 12”
“range: 13”
“range: 14”
“range: 15”
generate()
generate를 사용하여 15부터 시작하여 30보다 작은 숫자에 2를 더한 값을 발행하는 옵져버블 obs4$를 생성하여 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { generate } = rxjs
const generate = rxjs.generate
const obs4$ = generate(
15, x => x < 30, x => x + 2
)
obs4$.subscribe(item => console.log(`generate: ${item}`))
<console>
“generate: 15”
“generate: 17”
“generate: 19”
“generate: 21”
“generate: 23”
“generate: 25”
“generate: 27”
“generate: 29”
2. 시간을 다루는 옵저버블
interval()
interval을 사용하여 0부터 1초에 한번씩 늘어나게 발행하는 옵져버블 obs1$을 생성하는 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { interval } = rxjs
// const range = rxjs. interval -> 위 코드와 같은 코드
const obs1$ = interval(1000)
obs1$.subscribe(item => console.log(`interval: ${item}`))
<console>
“interval: 0”
“interval: 1”
“interval: 2”
“interval: 3”
“interval: 4”
“interval: 5”
“interval: 6”
“interval: 7”
“interval: 8”
“interval: 9”
“interval: 10”
…
timer()
timer를 사용하여 3초후에 값을 발행하는 옵져버블 obs2$를 생성한 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { timer } = rxjs
const obs2$ = timer(3000)
obs2$.subscribe(item => console.log(`timer: ${item}`))
<console>
“timer: 0”
3. 이벤트를 다루는 옵져버블
fromEvent()
fromEvent를 사용하여 마우스로 document 부분을 클릭했을 때와 document의 아이디 값이 myInput인 것을 찾아내 값 입력을 받았을 때라는 시간을 발행하는 옵져버블 obs1$과 obs2$를 만들어 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
<input id="myInput" type="text"/>
const { fromEvent } = rxjs
// 마우스 클릭 이벤트
const obs1$ = fromEvent(document, 'click')
obs1$.subscribe(item => console.log(item))
// 키프레스 이벤트
const obs2$ = fromEvent(document.getElementById('myInput'), 'keypress')
obs2$.subscribe(item => console.log(item))
4. Ajax 요청하는 옵져버블
ajax()
ajax를 사용하여 서버에 값을 요청을 발행하는 옵져버블 obs&를 만들어 이를 구독하는 코드를 작성
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { ajax } = rxjs.ajax
const obs$ = ajax(`http://127.0.0.1:3000/people/1`)
obs$.subscribe(result => console.log(result.response))
5. 커스터마이징 옵져버블
new Observable()
<script src="https://unpkg.com/@reactivex/rxjs/dist/global/rxjs.umd.js"></script>
const { Observable } = rxjs
const obs$ = new Observable(subscriber => {
subscriber.next(1)
subscriber.next(2)
subscriber.next(3)
// 값을 다 발행한 뒤에는 compelte를 실행하여 메모리 해제
subscriber.complete()
})
obs$.subscribe(item => console.log(item))
옵져버블의 특징
- 누군가 구독을 해야 발행을 시작
- 각 구독자에게 따로 발행
const { of, interval, fromEvent } = rxjs
const obs1$ = of('a', 'b', 'c')
const obs2$ = interval(1000)
const obs3$ = fromEvent(document, 'click')
setTimeout(_ => {
console.log('of 구독 시작')
obs1$.subscribe(item => console.log(item))
}, 5000)
setTimeout(_ => {
console.log('interval 구독 시작')
obs2$.subscribe(item => console.log(item))
}, 10000)
setTimeout(_ => {
console.log('fromEvent 구독 시작')
obs3$.subscribe(_ => console.log('click!'))
}, 15000)
setTimeout(_ => {
console.log('interval 구독 시작 2')
obs2$.subscribe(item => console.log(item))
}, 20000)
<console>
“of 구독 시작”
“a”
“b”
“c”
“interval 구독 시작”
0
1
2
3
“fromEvent 구독 시작”
4
“click!”
“click!”
5
“click!”
“click!”
6
“click!”
“click!”
7
8
“interval 구독 시작 2”
9
0
10
1
11
2
12
3
13
“click!”
4
14
5
15
6
16
“click!”
7
17
8
18
“click!”
9
19
10
20
11
21
12
22
13
23
14
24
15
25
16
26