SlideShare ist ein Scribd-Unternehmen logo
1 von 100
Downloaden Sie, um offline zu lesen
RXJS
A BETTER ASYNC
1
About me
Google Developer Expert
Telerik Developer Expert
Fullstack developer at McKinsey Digital Labs
@chris_noring
2
Async is hard to code without creating this
3 . 1
Spaghetti code
3 . 2
Spaghetti code in the form of this
3 . 3
3 . 4
YOU GUESSED IT
CALLBACK HELL
3 . 5
getData(function(data){
getMoreData( data, function(moreData) {
getEvenMoreData( moreData, function(evenMoreData){
})
})
})
3 . 6
SO, WHATS BETTER?
3 . 7
Promises
getData()
.then( getMoreData )
.then( getEvenMoreData )
3 . 8
Async await
let data = await getData()
let moreData await getMoreData( data )
let evenMoreData = await getEvenMoreData( moreData )
3 . 9
Why should I go with RxJS over Promises?
4 . 1
You have problems with connectivity
Your data behaves more like a continuous stream of
data than Request/Response
Essentially: your Async code starts to look messy
and/or consists of a lot of endpoints with data that
looks and behaves diïŹ€erently.
4 . 2
PROMISES ARE NOT
ENOUGH IN
COMPLEX
SCENARIOS
4 . 3
Returns one value only
Hard to retry
No cancellation
Doesn't mix easily with other async concepts
4 . 4
RXJS AND
OBSERVABLE
TO THE RESCUE
4 . 5
WHAT IS AN
OBSERVABLE?
5 . 1
Think of an Observable as a combination of an Array
and a Promise
5 . 2
Array
Promise
list
.map( x = > x.prop )
.filter( x => x > 2 )
.take( 2 )
getData()
.then(
data => console.log(data),
err => console.error(error)
)
5 . 3
Observable
let stream$ = Rx.Observable.of({prop: 1},{prop: 2},{prop: 3});
stream$
.map( x => x.prop)
.filter( x => x > 2 )
.take( 2 )
.subscribe(
data => console.log(data),
err => console.error(error)
)
5 . 4
Observable = Array + Promise + Cancelling + Retry and
more =
Superpowers
5 . 5
An Observable is a function that takes an observer
as an argument
An observer is an object with the methods
Example
.next()
.error()
.complete()
Rx.Observable.create(observer => {
observer.next(1)
observer.error('err')
observer.complete()
});
5 . 6
Creating an observable - emitting data:
let stream$ = Rx.Observable.create( observer => {
observer.next( 1 ); // 1
observer.error('error'); // 2
observer.complete(); // 3
})
let subscription = stream$.subscribe(
data => console.log('Data',data), // 1
err => console.error(err), // 2
() => console.log('complete') // 3
)
5 . 7
Subscribing/ Unsubscribing:
let subscription = stream$.subscribe(
data => console.log('Data',data),
err => console.error(err)
)
setTimeout(() => {
subscription.unsubscribe();
},3000);
5 . 8
Define unsubscribe behaviour - to clean up:
let stream$ = Rx.Observable.create( observer => {
let i = 0;
let id = setInterval(() =>{
observer.next( i++ );
},1000)
return function IAmCalledOnUnsubscribe(){
clearInterval( id );
}
})
setTimeout(() => {
subscription.unsubscribe();
},3000);
5 . 9
CREATE
OBSERVABLES FROM
SOMETHING
6 . 1
Create using a factory function
6 . 2
And many more...
Rx.Observable.from([2,3,4,5])
Rx.Observable.from(new Promise(resolve, reject) => {
// do async work
resolve( data )
})
Rx.Observable.of(1,2);
Rx.Observable.fromEvent(document, 'mousemove')
Rx.Observable.interval(1000)
6 . 3
Create by wrapping an API
6 . 4
Emitting data - observer.next()
Handle error - observer.error()
Close the stream - observer.complete()
6 . 5
let stream = Rx.Observable.create((observer) => {
let request = new XMLHttpRequest();
request.open( ‘GET’, ‘url’ );
request.onload = () =>{
if(request.status === 200) {
observer.next( request.response ); // 1
observer.complete(); // 3
}
}
request.onerror = () => {
observer.error('error happened'); // 2
request.send();
}
});
6 . 6
OPERATORS
IS WHAT GIVE OBSERVABLES ITS POWER
7 . 1
There are 60+ operators
7 . 2
construction
conversion
combination
mathematical
time based
7 . 3
Just learn a few important operators from each
category to start with.
7 . 4
Operators are chained and happens before
.subscribe()
Rx.Observable.of(1,2,3,4)
.operator()
.operator()
.operator()
.subscribe()
7 . 5
What an operator does can be graphically presented as
a Marble Diagram.
See more operators at http://rxmarbles.com/
7 . 6
map/filter
Rx.Observable
.of( 1,2,3 )
.map( x => x +1 )
.filter( x => x % 2 === 0 );
7 . 7
do - use to debug, can be placed where you need it.
Rx.Observable
.of( 1,2,3 )
.do( x => console.log(x) )
.map( x => x +1 )
.filter( x => x % 2 === 0 )
.do( x => console.log(x) )
7 . 8
flatMap, sometimes you need to create an Observable
inside an Observable. example: Based on a keyup we
want to do an ajax call
PROBLEM : we get a list of Observables instead of 1
Observable
Rx.Observable.fromEvent(document,'keyup')
.map(ev => event.target.value)
.map( key => {
return Rx.DOM.json(url)
})
7 . 9
SOLUTION: flatMap
Creates a metastream instead of a list of Observables
Rx.Observable.fromEvent(document,'keyup')
.map(ev => event.target.value)
.flatMap( key => {
return Rx.DOM.json(url)
})
7 . 10
Sometimes `flatMap` is a bad match. You want to be
able to abandon what you were doing if precondition
change. Example a dependent call chain
7 . 11
This ensures the rest is thrown away if the user
changes
Rx.Observable.fromEvent(document,'keyup')
.map(ev => ev.target.value)
.switchMap(getUser)
.switchMap(getOrdersByUser)
.switchMap(getProductsByOrder)
7 . 12
RECIPES
8 . 1
Auto complete
8 . 2
Requirements
Listen for keyboard presses
Only do server trip a er x number of characters are
entered
Do ajax call based on filtered input
Cash responses
8 . 3
Procedural approach
8 . 4
let input = $(‘#input’);
input.bind(‘keyup’,() = >{
let val = input.val()
if(val.length >= 3 ) {
if( isCached( val ) ) {
buildList( getFromCache(val) );
return;
}
doAjax( val ).then( (response) => {
buildList( response.json() )
storeInCache( val, response.json() )
});
}
})
8 . 5
Rxjs - streaming approach
8 . 6
8 . 7
let stream$ = Rx.Observable.fromEvent(input, 'keyup')
.map( ev => ev.target.value )
.filter( text => text.length >= 3 )
.distintUntilChanged()
.switchMap( val => Rx.DOM.getJSON(url_to_json))
stream$.subscribe( data => console.log(data));
8 . 8
RXJS VS PROMISES
9 . 1
I know how to do things with Promises, but how do I
do it in Rxjs?
9 . 2
Simple scenario:
9 . 3
Promise version
getData().then(
data => console.log( data ),
err => console.error( err )
)
9 . 4
Rxjs version
getData().subscribe(
data => console.log( data ),
err => console.error( err ),
() => console.log('completed')
)
9 . 5
Cascading calls, calls need to happen in a certain order
9 . 6
replace Promise.resolve()
getData(){
return Promise.resolve(123);
}
9 . 7
with Observable version
getData(){
return Rx.DOM.getJSON( 'data3.json' );;
}
9 . 8
AND
9 . 9
replace .then()
getUser()
.then(getOrderByUser)
.then(getProductsByOrder)
9 . 10
with .switchMap()
getUser()
.switchMap(getOrderByUser)
.switchMap(getProductsByOrder)
9 . 11
Short word on switchMap
First stream of cascading calls are abandoned if user is
changed
9 . 12
What about semi dependant calls where parts of the
data can be fetched in parallel?
9 . 13
Promise approach
getUser()
.then( user => {
return Promise.all([
getMessages( user.id ),
getOrders( user.id )
])
})
9 . 14
Observable approach
getUser()
.switchMap( user => {
return Rx.Observable.forkJoin(
getMessages( user.id ),
getOrders( user.id )
)
})
9 . 15
ERROR HANDLING,
WHEN STREAMS FAIL
10 . 1
Streams fail, and when they do you need a plan on
how to handle it
10 . 2
Catch and Transform
Ignore
Retry til it works, or give up trying eventually
10 . 3
Reaching the error callback but no completion
let stream$ = Rx.Observable.create(observer => {
observer.next( 1 );
throw { name : 'some error' }
});
stream$.subscribe(
data => console.log(data), // 1
err => console.error(err) // 'some error',
() => console.log('completed') // not reached
)
10 . 4
Catching the error
10 . 5
EïŹ€ectively swallowing the error.
let stream$ = Rx.Observable.create(observer => {
observer.next( 1 );
throw { message : 'some error' }
})
.catch( err => Rx.Observable.of(err.message))
stream$.subscribe(
data => console.log(data), // 1, 'some error'
err => console.error(err), // not reached
() => console.log('completed') // completed
)
10 . 6
Ignoring the error
10 . 7
When merging diïŹ€erent streams, what you want is
maybe to let one stream survive and the erronous
ones to fail silently
10 . 8
Let's first see what happens if we do nothing
10 . 9
We loose last stream because a stream failed before it,
order matters
Rx.Observable.merge(
Rx.Observable.of(1,2,3),
Rx.Observable.throw('err')
Rx.Observable.of(4,5)
)
.subscribe(
data => console.log(data), // 1,2,3
err => console.error(err), // err
() => console.log('completed') // not reached
)
10 . 10
Let the correct stream survive
10 . 11
Survival of the fittest with onErrorResumeNext()
Rx.Observable.onErrorResumeNext(
Rx.Observable.throw('error'),
Rx.Observable.throw('another error')
Rx.Observable.of(4,5)
)
.subscribe(
data => console.log(data), // 4,5
err => console.error(err), // not reached
() => console.log('completed') // completed
)
10 . 12
Retry - when you expect a diïŹ€erent result if you retry it
in a while OR a er x times.
10 . 13
Simple retry, postponing when error callback is hit
10 . 14
Postpone when the error callback is called
Rx.Observable.create(observer => {
observer.next( 1 );
throw { message : 'err' }
})
.retry(5) // times
.subscribe(
data => console.log(data),
err => console.log(err), // hit after 5 retry attempts
() => console.log('completed')
)
10 . 15
For 'shaky connections where you expect to succeed
eventually
Whole stream is retried if error is thrown
let stream$ = doAjax()
.retryWhen( errors => {
return errors.delay(200);
})
stream$.subscribe( data => console.log(data));
10 . 16
TESTING
11 . 1
Async testing is normally painful
11 . 2
Can we actually test methods that might take 2s or 2
min to run?
11 . 3
Short answer is yes we can
11 . 4
Its' called marble testing
11 . 5
It has a virtual clock - i.e we can increment time as we
see fit
11 . 6
It's a visual comparison
11 . 7
Expected stream:
x-y-z-#
Actual stream:
x-y-z-|
11 . 8
What are these symbols?
11 . 9
- = a time increment has passed
| = end of stream
# = an error has occured
x,y,z etc are values being emitted
11 . 10
Let's see some code
11 . 11
Arrange
const lhsMarble = '-x-y-z';
const expected = '-x-y-z';
const expectedMap = {
x: 1,
y: 2,
z : 3
};
11 . 12
Act - creating a Hot Observable, define our code to test
const lhs$ = testScheduler.createHotObservable(
lhsMarble,
expectedMap
);
const myAlgorithm = ( lhs ) =>
Rx.Observable
.from( lhs )
.operator()
.operator()
const actual$ = myAlgorithm( lhs$ );
11 . 13
Assert
testScheduler.expectObservable(actual$).toBe(
expected,
expectedMap
);
testScheduler.flush();
11 . 14
In summary
RxJS shines when your Async is complex
Observables can be created from almost any async
concept
Enables rich composition
Observables are easy to retry
RxJS is easily tested by using Marble Testing
Cancellation is easy, and you should
cancel/unsubscribe, to clean up resources
It's not ketchup, use it where appropriate
12 . 1
Further Reading
12 . 2
angular.io/resources "Rxjs Ultimate" - my free book
http://reactivex.io/rxjs/ - OïŹ€icial documentation
TRy out your snippets with RxFiddle.net
12 . 3
Thank you
13

Weitere Àhnliche Inhalte

Was ist angesagt?

Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for AndroidTomĂĄĆĄ Kypta
 
ReactiveCocoa in Practice
ReactiveCocoa in PracticeReactiveCocoa in Practice
ReactiveCocoa in PracticeOutware Mobile
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidEgor Andreevich
 
Introduction to rx java for android
Introduction to rx java for androidIntroduction to rx java for android
Introduction to rx java for androidEsa Firman
 
Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...Mario Fusco
 
Async JavaScript in ES7
Async JavaScript in ES7Async JavaScript in ES7
Async JavaScript in ES7Mike North
 
Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Tomasz Kowalczewski
 
RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)Tracy Lee
 
Akka.NET streams and reactive streams
Akka.NET streams and reactive streamsAkka.NET streams and reactive streams
Akka.NET streams and reactive streamsBartosz Sypytkowski
 
Understanding reactive programming with microsoft reactive extensions
Understanding reactive programming  with microsoft reactive extensionsUnderstanding reactive programming  with microsoft reactive extensions
Understanding reactive programming with microsoft reactive extensionsOleksandr Zhevzhyk
 
Learn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great GoodLearn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great GoodJason Larsen
 
Behind modern concurrency primitives
Behind modern concurrency primitivesBehind modern concurrency primitives
Behind modern concurrency primitivesBartosz Sypytkowski
 
Source Code for Dpilot
Source Code for Dpilot Source Code for Dpilot
Source Code for Dpilot Nidhi Chauhan
 
Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots DeepAnshu Sharma
 
JavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good PartsJavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good PartsKonrad Malawski
 
2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+android
2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+android2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+android
2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+androidSTEP Computer Academy (Zaporozhye)
 
Async History - javascript
Async History - javascriptAsync History - javascript
Async History - javascriptNishchit Dhanani
 
The Ring programming language version 1.3 book - Part 7 of 88
The Ring programming language version 1.3 book - Part 7 of 88The Ring programming language version 1.3 book - Part 7 of 88
The Ring programming language version 1.3 book - Part 7 of 88Mahmoud Samir Fayed
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of ControlChad Hietala
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on AndroidDustin Graham
 

Was ist angesagt? (20)

Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
 
ReactiveCocoa in Practice
ReactiveCocoa in PracticeReactiveCocoa in Practice
ReactiveCocoa in Practice
 
Intro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich AndroidIntro to RxJava/RxAndroid - GDG Munich Android
Intro to RxJava/RxAndroid - GDG Munich Android
 
Introduction to rx java for android
Introduction to rx java for androidIntroduction to rx java for android
Introduction to rx java for android
 
Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...Reactive Programming for a demanding world: building event-driven and respons...
Reactive Programming for a demanding world: building event-driven and respons...
 
Async JavaScript in ES7
Async JavaScript in ES7Async JavaScript in ES7
Async JavaScript in ES7
 
Reactive Java (33rd Degree)
Reactive Java (33rd Degree)Reactive Java (33rd Degree)
Reactive Java (33rd Degree)
 
RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)RxJS Operators - Real World Use Cases (FULL VERSION)
RxJS Operators - Real World Use Cases (FULL VERSION)
 
Akka.NET streams and reactive streams
Akka.NET streams and reactive streamsAkka.NET streams and reactive streams
Akka.NET streams and reactive streams
 
Understanding reactive programming with microsoft reactive extensions
Understanding reactive programming  with microsoft reactive extensionsUnderstanding reactive programming  with microsoft reactive extensions
Understanding reactive programming with microsoft reactive extensions
 
Learn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great GoodLearn You a ReactiveCocoa for Great Good
Learn You a ReactiveCocoa for Great Good
 
Behind modern concurrency primitives
Behind modern concurrency primitivesBehind modern concurrency primitives
Behind modern concurrency primitives
 
Source Code for Dpilot
Source Code for Dpilot Source Code for Dpilot
Source Code for Dpilot
 
Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots Dpilot Source Code With ScreenShots
Dpilot Source Code With ScreenShots
 
JavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good PartsJavaOne 2013: Java 8 - The Good Parts
JavaOne 2013: Java 8 - The Good Parts
 
2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+android
2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+android2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+android
2 ĐżŃ€Đ”Đ·Đ”ĐœŃ‚Đ°Ń†ĐžŃ rx java+android
 
Async History - javascript
Async History - javascriptAsync History - javascript
Async History - javascript
 
The Ring programming language version 1.3 book - Part 7 of 88
The Ring programming language version 1.3 book - Part 7 of 88The Ring programming language version 1.3 book - Part 7 of 88
The Ring programming language version 1.3 book - Part 7 of 88
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
 

Ähnlich wie Rxjs vienna

Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Leonardo Borges
 
JS Fest 2019 Node.js Antipatterns
JS Fest 2019 Node.js AntipatternsJS Fest 2019 Node.js Antipatterns
JS Fest 2019 Node.js AntipatternsTimur Shemsedinov
 
Lambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter LawreyLambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter LawreyJAXLondon_Conference
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on AndroidTomĂĄĆĄ Kypta
 
Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"
Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"
Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"OdessaJS Conf
 
Asynchronous programming with java script and node.js
Asynchronous programming with java script and node.jsAsynchronous programming with java script and node.js
Asynchronous programming with java script and node.jsTimur Shemsedinov
 
Writing Redis in Python with asyncio
Writing Redis in Python with asyncioWriting Redis in Python with asyncio
Writing Redis in Python with asyncioJames Saryerwinnie
 
Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Ben Lesh
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSAdam L Barrett
 
Jdbc ja
Jdbc jaJdbc ja
Jdbc jaDEEPIKA T
 
rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simplerAlexander Mostovenko
 
WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...
WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...
WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...GeeksLab Odessa
 
Seminar PSU 10.10.2014 mme
Seminar PSU 10.10.2014 mmeSeminar PSU 10.10.2014 mme
Seminar PSU 10.10.2014 mmeVyacheslav Arbuzov
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsPiotr Pelczar
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB
 
Expert JavaScript tricks of the masters
Expert JavaScript  tricks of the mastersExpert JavaScript  tricks of the masters
Expert JavaScript tricks of the mastersAra Pehlivanian
 

Ähnlich wie Rxjs vienna (20)

Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015Futures e abstração - QCon São Paulo 2015
Futures e abstração - QCon São Paulo 2015
 
JS Fest 2019 Node.js Antipatterns
JS Fest 2019 Node.js AntipatternsJS Fest 2019 Node.js Antipatterns
JS Fest 2019 Node.js Antipatterns
 
Lambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter LawreyLambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter Lawrey
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
 
Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"
Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"
Timur Shemsedinov "Пошу ĐœĐ° ĐșĐŸĐ»Đ±Đ”Đșах, Đ° Ń‡Ń‚ĐŸ... (ĐŃĐžĐœŃ…Ń€ĐŸĐœĐœĐŸĐ” ĐżŃ€ĐŸĐłŃ€Đ°ĐŒĐŒĐžŃ€ĐŸĐČĐ°ĐœĐžĐ”)"
 
Asynchronous programming with java script and node.js
Asynchronous programming with java script and node.jsAsynchronous programming with java script and node.js
Asynchronous programming with java script and node.js
 
Writing Redis in Python with asyncio
Writing Redis in Python with asyncioWriting Redis in Python with asyncio
Writing Redis in Python with asyncio
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
 
Rxjs kyivjs 2015
Rxjs kyivjs 2015Rxjs kyivjs 2015
Rxjs kyivjs 2015
 
Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016Async Redux Actions With RxJS - React Rally 2016
Async Redux Actions With RxJS - React Rally 2016
 
JDBC (2).ppt
JDBC (2).pptJDBC (2).ppt
JDBC (2).ppt
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJS
 
Jdbc ja
Jdbc jaJdbc ja
Jdbc ja
 
rx.js make async programming simpler
rx.js make async programming simplerrx.js make async programming simpler
rx.js make async programming simpler
 
WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...
WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...
WebCamp:Front-end Developers Day. АлДĐșŃĐ°ĐœĐŽŃ€ ĐœĐŸŃŃ‚ĐŸĐČĐ”ĐœĐșĐŸ "Rx.js - ĐŽĐ”Đ»Đ°Đ”ĐŒ Đ°ŃĐžĐœŃ…Ń€...
 
Seminar PSU 10.10.2014 mme
Seminar PSU 10.10.2014 mmeSeminar PSU 10.10.2014 mme
Seminar PSU 10.10.2014 mme
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.js
 
MongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-esMongoDB World 2019: Life In Stitch-es
MongoDB World 2019: Life In Stitch-es
 
Expert JavaScript tricks of the masters
Expert JavaScript  tricks of the mastersExpert JavaScript  tricks of the masters
Expert JavaScript tricks of the masters
 
Node.js - Best practices
Node.js  - Best practicesNode.js  - Best practices
Node.js - Best practices
 

Mehr von Christoffer Noring (20)

Azure signalR
Azure signalRAzure signalR
Azure signalR
 
Game dev 101 part 3
Game dev 101 part 3Game dev 101 part 3
Game dev 101 part 3
 
Game dev 101 part 2
Game dev 101   part 2Game dev 101   part 2
Game dev 101 part 2
 
Game dev workshop
Game dev workshopGame dev workshop
Game dev workshop
 
Deploying your static web app to the Cloud
Deploying your static web app to the CloudDeploying your static web app to the Cloud
Deploying your static web app to the Cloud
 
IaaS with ARM templates for Azure
IaaS with ARM templates for AzureIaaS with ARM templates for Azure
IaaS with ARM templates for Azure
 
Learning Svelte
Learning SvelteLearning Svelte
Learning Svelte
 
Ng spain
Ng spainNg spain
Ng spain
 
Angular Schematics
Angular SchematicsAngular Schematics
Angular Schematics
 
Design thinking
Design thinkingDesign thinking
Design thinking
 
Keynote ijs
Keynote ijsKeynote ijs
Keynote ijs
 
Vue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and VuexVue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and Vuex
 
Ngrx slides
Ngrx slidesNgrx slides
Ngrx slides
 
Kendoui
KendouiKendoui
Kendoui
 
Angular mix chrisnoring
Angular mix chrisnoringAngular mix chrisnoring
Angular mix chrisnoring
 
Nativescript angular
Nativescript angularNativescript angular
Nativescript angular
 
Graphql, REST and Apollo
Graphql, REST and ApolloGraphql, REST and Apollo
Graphql, REST and Apollo
 
Angular 2 introduction
Angular 2 introductionAngular 2 introduction
Angular 2 introduction
 
React lecture
React lectureReact lecture
React lecture
 
Angular modules in depth
Angular modules in depthAngular modules in depth
Angular modules in depth
 

KĂŒrzlich hochgeladen

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEarley Information Science
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...apidays
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilV3cube
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Igalia
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...gurkirankumar98700
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptxHampshireHUG
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking MenDelhi Call girls
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024Rafal Los
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking MenDelhi Call girls
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processorsdebabhi2
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreternaman860154
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 

KĂŒrzlich hochgeladen (20)

EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptxEIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
EIS-Webinar-Prompt-Knowledge-Eng-2024-04-08.pptx
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
Apidays Singapore 2024 - Building Digital Trust in a Digital Economy by Veron...
 
Developing An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of BrazilDeveloping An App To Navigate The Roads of Brazil
Developing An App To Navigate The Roads of Brazil
 
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
Raspberry Pi 5: Challenges and Solutions in Bringing up an OpenGL/Vulkan Driv...
 
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...
Kalyanpur ) Call Girls in Lucknow Finest Escorts Service 🍾 8923113531 🎰 Avail...
 
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
04-2024-HHUG-Sales-and-Marketing-Alignment.pptx
 
08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men08448380779 Call Girls In Friends Colony Women Seeking Men
08448380779 Call Girls In Friends Colony Women Seeking Men
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024The 7 Things I Know About Cyber Security After 25 Years | April 2024
The 7 Things I Know About Cyber Security After 25 Years | April 2024
 
08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men08448380779 Call Girls In Civil Lines Women Seeking Men
08448380779 Call Girls In Civil Lines Women Seeking Men
 
Exploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone ProcessorsExploring the Future Potential of AI-Enabled Smartphone Processors
Exploring the Future Potential of AI-Enabled Smartphone Processors
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Presentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreterPresentation on how to chat with PDF using ChatGPT code interpreter
Presentation on how to chat with PDF using ChatGPT code interpreter
 
Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 

Rxjs vienna