RxJS: A Beginner & Expert's Perspective - ng-conf 2017

61
RxJS A Beginner & Expert’s Perspective

Transcript of RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Page 1: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

RxJS

A Beginner & Expert’s Perspective

Page 2: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Page 3: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Page 4: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Learning RxJS Be Like...

Couldn’t find the right docs!

@benlesh | @ladyleet

Page 5: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

What do these operators even do?

Learning RxJS Be Like...

@benlesh | @ladyleet

Page 6: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

How do I wrap APIs in Observables?

Learning RxJS Be Like...

@benlesh | @ladyleet

Page 7: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Oops, I forgot to subscribe. (╯°□°)╯︵ ┻━┻

Learning RxJS Be Like...

@benlesh | @ladyleet

Page 8: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Page 9: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Tracy Lee @ladyleet

A Beginner & Expert’s Perspective

Ben Lesh @benlesh

Page 10: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Tracy Lee @ladyleet

Beginner & Expert

Ben Lesh @benlesh

Google Developer

Expert

Page 11: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Tracy Lee @ladyleet

Beginner & Expert

Ben Lesh @benlesh

Google Developer

Expert

Co-Founder This Dot Labs

Page 12: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Tracy Lee @ladyleet

Beginner & Expert

Ben Lesh @benlesh

Google Developer

Expert

Co-Founder This Dot Labs

Learned RxJS a few months

ago

Page 13: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Tracy Lee @ladyleet

Beginner & Expert

Ben Lesh @benlesh

Software Engineer, Google

Page 14: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Tracy Lee @ladyleet

Beginner & Expert

Ben Lesh @benlesh

Software Engineer, Google

Formerly Netflix

Page 15: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Tracy Lee @ladyleet

Beginner & Expert

Ben Lesh @benlesh

Software Engineer, Google

Formerly Netflix

RxJS5+ Lead

Page 16: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Page 17: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

A Beginner & Expert’s Perspective On Learning & Using RxJS

- How to create an Observable - Best practices for importing and using RxJS - How to choose operators and find documentation - How to avoid unwanted subscriptions - How to wrap an API - The benefits of “same-shapedness”

@benlesh | @ladyleet

Page 18: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

const x = new Observable(observer => { observer.next(‘hi’); observer.complete(); });

@benlesh | @ladyleet

Creating a New Observable

Page 19: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Many other Observable creation methods

@benlesh | @ladyleet

Page 20: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Page 21: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Versions

Angular 4.0.1 Angular-CLI 1.0.0 RxJS 5.3.0 Angular Material 2.0.0-beta.2

@benlesh | @ladyleet

Page 22: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

// Add a funny pun about Angular 4 and Angular CLI

@benlesh | @ladyleet

Page 23: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Lookahead Search

The Idiomatic RxJS Example

@benlesh | @ladyleet

Page 24: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Add an <input> to your component’s template

@benlesh | @ladyleet

Getting Observable of text changes from input

Page 25: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Use Subject as an event handler in input event

@benlesh | @ladyleet

Getting Observable of text changes from input

Page 26: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Use a template reference variable to get the text value

@benlesh | @ladyleet

Getting Observable of text changes from input

Page 27: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Using the next method to push values through the Observable

@benlesh | @ladyleet

Getting Observable of text changes from input

Page 28: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Import Subject from RxJS

@benlesh | @ladyleet

Getting Observable of text changes from input

Page 29: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Add the Subject

@benlesh | @ladyleet

Getting Observable of text changes from your input

Page 30: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

On the subject of Subjects...

- Subjects are Observables

- Subjects are Observers (with next, error and complete)

- Allow us to push values by calling `subject$.next(value)`

- Have all operators on them any observable would

@benlesh | @ladyleet

Page 31: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Importing RxJS

… this is where a lot of beginners make a mistake

Page 32: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Beginner Mistake: Importing ALL of RxJS 5

@benlesh | @ladyleet

Page 33: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Include Just What You Need

@benlesh | @ladyleet

Page 34: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Back to Our Pun App

We have an Observable of text input changes - keywordInputChange$

… give us the keywords we might be looking for!

@benlesh | @ladyleet

Page 35: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

To Get Our Data, We’ve Created “PunService”

@benlesh | @ladyleet

Page 36: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

PunService Uses Http From @angular/http

@benlesh | @ladyleet

Page 37: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Take Observable of Textbox Changes and Get a List of Suggested Keywords

@benlesh | @ladyleet

Page 38: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

switchMap

Converts the value to a new observable, then switches to that observable (unsubscribing from any previous ones it might have made)

@benlesh | @ladyleet

Page 39: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Operators: Why switchMap?

Page 40: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Writing Suggested Keywords to the View

Page 41: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Get List of Puns from List of Keywords

@benlesh | @ladyleet

Page 42: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Displaying Puns

@benlesh | @ladyleet

Page 43: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Subscribing to keyword$

@benlesh | @ladyleet

Page 44: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Let’s Share keyword$

@benlesh | @ladyleet

Page 45: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Page 46: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Same Shaped-nessLet’s add another data source!

@benlesh | @ladyleet

Page 47: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Web Speech APIhttps://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API

@benlesh | @ladyleet

Page 48: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Wrap an API in an Observable

@benlesh | @ladyleet

Page 49: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Wrap an API in an Observable

@benlesh | @ladyleet

Page 50: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Wrap an API in an Observable

@benlesh | @ladyleet

Page 51: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

An Angular Service

- Injectable

- Actually use all results

- Add error handling

@benlesh | @ladyleet

Page 52: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Add Button to Trigger Speech Recognition

@benlesh | @ladyleet

Page 53: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Pump our clicks through a Subject

@benlesh | @ladyleet

Page 54: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Inject SpeechService

@benlesh | @ladyleet

Page 55: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

switchMap Clicks into Speech Recognition

@benlesh | @ladyleet

Page 56: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Merge Typed Keyword Suggestions With Spoken Ones

@benlesh | @ladyleet

Page 57: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Same shaped-ness!This works because they’re both Observable<string[]>

@benlesh | @ladyleet

Page 58: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

@benlesh | @ladyleet

Page 59: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

A Beginner & Expert’s Perspective On Learning & Using RxJS

- How to create an Observable - Best practices for importing and using RxJS - How to choose operators and find documentation - How to avoid unwanted subscriptions - How to wrap an API - The benefits of “same-shapedness”

@benlesh | @ladyleet

Page 60: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Resources

https://github.com/ladyleet/rxjs-test

http://reactivex.io/rxjs

https://developer.mozilla.org/en-US/docs/Web/API/Web_Speech_API

https://cloud.google.com/vision/

@benlesh | @ladyleet

Page 61: RxJS: A Beginner & Expert's Perspective - ng-conf 2017

Thank You!

@benlesh | @ladyleet