Slide 1

Slide 1 text

RxJS Ͱঢ়ଶΛ؅ཧ͢Δ Meguro.es #15 @ Drecom

Slide 2

Slide 2 text

ࣗݾ঺հ • ੢ాխത • @adwd118 (twitter) • @adwd (github) • ~2018/1 Bizreach • 2018/2~ Mercari/Merpay

Slide 3

Slide 3 text

RxJS

Slide 4

Slide 4 text

RxJS • ΠϕϯτɾඇಉظΛѻ͏ϥΠϒϥϦ • C#(ຊՈ), Java, Swift, JSͳͲͳͲͷ࣮૷͕͋Δ • ๛෋ͳAPIͰඇಉظΛ͔͋ͭ͑Δ • Angular͸RxJSΛ࢖͍ͬͯΔ

Slide 5

Slide 5 text

RxJSͷAPI • ͨ͘͞Μ͋ΔͷͰࠓճ࢖͏΍͚ͭͩ • Observable • Subject • BehaviorSubject • operators • map/filter/switchMap/debounceTime …

Slide 6

Slide 6 text

Observable • ඇಉظʹσʔλ͕ྲྀΕͯ͘ΔΦϒδΣΫτ • addEventListenerΈ͍ͨͳͷ • ஋͕Կճ΋དྷΔPromiseΈ͍ͨͳͷ

Slide 7

Slide 7 text

const obs1 = Rx.Observable.interval(1000); obs1.subscribe(count => console.log(‘count: ‘ + count)); // count: 1 // count: 2 // count: 3 const obs2 = Rx.Observable.fromEvent(document.body, ‘click') obs2.pipe( map(ev => ({ x: ev.clientX, y: ev.clientY })), filter(pos => pos.x > 400), ).subscribe(ev => console.log(ev)) // { x: 1000, y: 1000 } // { x: 1000, y: 200 } ͸ग़ྗ͞Εͳ͍ Observable

Slide 8

Slide 8 text

Subject • ஋Λྲྀ͢ϝιου΋ੜ͑ͯΔObservable • Subject#next

Slide 9

Slide 9 text

Subject const myEvent = new Subject(); myEvent.subscribe(ev => console.log(‘event: ‘ + ev)); myEvent.next(‘hi’) // event: hi myEvent.next(‘yo’) // event: yo

Slide 10

Slide 10 text

BehaviorSubject • ݱࡏͷ஋Λอ͍࣋ͯ͠ΔSubject • Subjectͱͷࠩҟ • BehaviorSubject#getValue() • BehaviorSubject.subscribeͨ͠ॠؒʹݱࡏ ͷ஋͕ྲྀΕͯ͘Δ

Slide 11

Slide 11 text

BehaviorSubject // ॳظ஋ΛίϯετϥΫλͷҾ਺ʹऔΔɹ const myTodos = new BehaviorSubject([]); myTodos.subscribe(todos => console.log(‘todos: ‘ + todos.length)); // todos: 0 // subscribeͨ͠ॠؒ஋͕ྲྀΕͯ͘Δ myTodos.next([ { id: 1, text: ‘do something’ } ]); // todos: 1

Slide 12

Slide 12 text

BehaviorSubject = Flux • BehaviorSubject͕΄΅Flux(Redux)Λ΍ͬͯ͘ΕΔ • BS#next => action • BS#subscribe => connect(react-redux) • combineLatest => combineReducers • (BehaviorSubject͡Όͳͯ͘Observableʹͳ Δ)

Slide 13

Slide 13 text

create-subscription • https://github.com/facebook/react/tree/ master/packages/create-subscription • reactνʔϜެࣜͷύοέʔδ • BehaviorSubjectΛσʔλιʔεͱ͢Δαϯϓ ϧ͕υΩϡϝϯτʹॻ͍ͯ͋Δ • Observableͷػӡʁ

Slide 14

Slide 14 text

create-subscription example import { createSubscription } from ‘create-subscription’; const BehaviorSubscription = createSubscription({ getCurrentValue: behaviorSubject => behaviorSubject.getValue(), subscribe: (behaviorSubject, callback) => { const subscription = behaviorSubject.subscribe(callback); return () => subscription.unsubscribe(); } }); {todos =>

Slide 15

Slide 15 text

examples

Slide 16

Slide 16 text

Todomvc const todos = new BehaviorSubject([]); const addTodo = text => { const current = todos.getValue(); todos.next([…current, { text, id: newId() }]); }; const filter = new BehaviorSubject(‘all’); // all, active, completed const filteredTodos = combineLatest(todos, filter) .pipe(map(v => switch(v.filter) { case ‘all’: return todos; case ‘active: return todos.filter(t => !t.completed); … }))

Slide 17

Slide 17 text

search w/ throttling const searchText = new BehaviorSubject(‘’); const searchResults = searchText.pipe( debounceTime(1000), switchMap(text => fetch(`/search?q=${text}`)) ) searchText.next(text)} />

Slide 18

Slide 18 text

αϯϓϧίʔυ • https://github.com/adwd/react-rxjs-todomvc • reduxjs/reduxͷtodomvc exampleΛϕʔε ʹͯ͠ஔ͖׵࣮͑ͨ૷

Slide 19

Slide 19 text

RxJSʹͯ͠Կ͕͍͍ͷ͔ • ๛෋ͳΦϖϨʔλͰReduxͷselector΍ɺmiddlewareΛ ͔ͭͬͯ΍ͬͯͨdebounceͱ͔͕؆୯ʹͰ͖Δ • Reduxͱൺ΂Δͱ • actionɺswitchจͱ͔ॻ͔ͳ͍͍ͯ͘ • MobXͱൺ΂Δͱ • ϚδοΫײ͕ͳ͍ʢRxJSʹϚδοΫײ͸ด͡ΒΕΔʣ

Slide 20

Slide 20 text

RxJSͷΑ͘ͳ͍ͱ͜ • ֶशίετ • APIׂ͕ͱେ͖͘มΘΔʁ(v5 -> v6)

Slide 21

Slide 21 text

BehaviorSubjectͰFluxͰ͖ͨ • ͋ͱ͸HoCͳΓͰBSɺؔ਺΁ͷࢀরΛίϯ ϙʔωϯτʹ༩͑ͯ΍Ε͹͍͍ • ୯७ʹexport constͰఆٛͯͦ͠ΕΛ௚઀ίϯ ϙʔωϯτ͔Βࢀর͢Δͷ΋Ͱ͖Δ

Slide 22

Slide 22 text

࢓ࣄͷϓϩδΣΫτʹ౤ೖத • Google Mapͷ্Ͱ͍Ζ͍Ζ͢ΔΞϓϦ • ϚοϓͷυϥοάʹԠͯ͡ൣғ಺ͷϞϊΛݕࡧ͢ΔAPIΛୟ ͘ • ݱࡏ஍Λnavigator.geolocation.watchPositionͰlistenͯ͠ ϓϩοτ͢Δ • ·ͩ·ͩվળ఺͸ͨ͘͞Μ͋Δ • ΍ͬͯΔ࠷தʹผϓϩδΣΫτʹҟಈ

Slide 23

Slide 23 text

·ͱΊ • ࢓ࣄͰRedux -> RxJSʹ͍ͯͨ͠ • ࣗ෼ͱͯ͠͸͘͢͝ྑ͘ͳͬͨ • Ҿ͖ܧ͍ͩΤϯδχΞ͕RxJS஌Βͳ͍৔߹… • GoogleͷAdWordsνʔϜ͕Flutter/AngularDartͰࣅͨΑ ͏ͳ͜ͱ(BLoC)΍ͬͯͨ • DartConf, Google I/O 2018ʹτʔΫ͕͋Δ

Slide 24

Slide 24 text

͓ΘΓ