SlideShare a Scribd company logo
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 differently.
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
Effectively 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 different 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 different 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/ - Official documentation
TRy out your snippets with RxFiddle.net
12 . 3
Thank you
13

More Related Content

What's hot

Practical RxJava for Android
Practical RxJava for AndroidPractical RxJava for Android
Practical RxJava for Android
Tomáš Kypta
 
ReactiveCocoa in Practice
ReactiveCocoa in PracticeReactiveCocoa in Practice
ReactiveCocoa in Practice
Outware 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 Android
Egor Andreevich
 
Introduction to rx java for android
Introduction to rx java for androidIntroduction to rx java for android
Introduction to rx java for android
Esa 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 ES7
Mike 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 streams
Bartosz 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 extensions
Oleksandr 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 Good
Jason Larsen
 
Behind modern concurrency primitives
Behind modern concurrency primitivesBehind modern concurrency primitives
Behind modern concurrency primitives
Bartosz 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 Parts
Konrad Malawski
 
2 презентация rx java+android
2 презентация rx java+android2 презентация rx java+android
2 презентация rx java+android
STEP Computer Academy (Zaporozhye)
 
Async History - javascript
Async History - javascriptAsync History - javascript
Async History - javascript
Nishchit 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 88
Mahmoud Samir Fayed
 
Inversion Of Control
Inversion Of ControlInversion Of Control
Inversion Of Control
Chad Hietala
 
RxJava on Android
RxJava on AndroidRxJava on Android
RxJava on Android
Dustin Graham
 

What's hot (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
 

Similar to 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 2015
Leonardo Borges
 
JS Fest 2019 Node.js Antipatterns
JS Fest 2019 Node.js AntipatternsJS Fest 2019 Node.js Antipatterns
JS Fest 2019 Node.js Antipatterns
Timur Shemsedinov
 
Lambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter LawreyLambdas puzzler - Peter Lawrey
Lambdas puzzler - Peter Lawrey
JAXLondon_Conference
 
Reactive programming on Android
Reactive programming on AndroidReactive programming on Android
Reactive programming on Android
Tomáš 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.js
Timur Shemsedinov
 
Writing Redis in Python with asyncio
Writing Redis in Python with asyncioWriting Redis in Python with asyncio
Writing Redis in Python with asyncio
James Saryerwinnie
 
Advanced redux
Advanced reduxAdvanced redux
Advanced redux
Boris Dinkevich
 
Rxjs kyivjs 2015
Rxjs kyivjs 2015Rxjs kyivjs 2015
Rxjs kyivjs 2015
Alexander Mostovenko
 
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
Ben Lesh
 
JDBC (2).ppt
JDBC (2).pptJDBC (2).ppt
JDBC (2).ppt
manvibaunthiyal1
 
Think Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJSThink Async: Asynchronous Patterns in NodeJS
Think Async: Asynchronous Patterns in NodeJS
Adam L Barrett
 
Jdbc ja
Jdbc jaJdbc ja
Jdbc ja
DEEPIKA 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 mme
Vyacheslav Arbuzov
 
Asynchronous programming done right - Node.js
Asynchronous programming done right - Node.jsAsynchronous programming done right - Node.js
Asynchronous programming done right - Node.js
Piotr 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-es
MongoDB
 
Expert JavaScript tricks of the masters
Expert JavaScript  tricks of the mastersExpert JavaScript  tricks of the masters
Expert JavaScript tricks of the masters
Ara Pehlivanian
 
Node.js - Best practices
Node.js  - Best practicesNode.js  - Best practices
Node.js - Best practices
Felix Geisendörfer
 

Similar to 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
 

More from Christoffer Noring

Azure signalR
Azure signalRAzure signalR
Azure signalR
Christoffer Noring
 
Game dev 101 part 3
Game dev 101 part 3Game dev 101 part 3
Game dev 101 part 3
Christoffer Noring
 
Game dev 101 part 2
Game dev 101   part 2Game dev 101   part 2
Game dev 101 part 2
Christoffer Noring
 
Game dev workshop
Game dev workshopGame dev workshop
Game dev workshop
Christoffer Noring
 
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
Christoffer Noring
 
IaaS with ARM templates for Azure
IaaS with ARM templates for AzureIaaS with ARM templates for Azure
IaaS with ARM templates for Azure
Christoffer Noring
 
Learning Svelte
Learning SvelteLearning Svelte
Learning Svelte
Christoffer Noring
 
Ng spain
Ng spainNg spain
Angular Schematics
Angular SchematicsAngular Schematics
Angular Schematics
Christoffer Noring
 
Design thinking
Design thinkingDesign thinking
Design thinking
Christoffer Noring
 
Keynote ijs
Keynote ijsKeynote ijs
Keynote ijs
Christoffer Noring
 
Vue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and VuexVue fundamentasl with Testing and Vuex
Vue fundamentasl with Testing and Vuex
Christoffer Noring
 
Ngrx slides
Ngrx slidesNgrx slides
Ngrx slides
Christoffer Noring
 
Kendoui
KendouiKendoui
Angular mix chrisnoring
Angular mix chrisnoringAngular mix chrisnoring
Angular mix chrisnoring
Christoffer Noring
 
Nativescript angular
Nativescript angularNativescript angular
Nativescript angular
Christoffer Noring
 
Graphql, REST and Apollo
Graphql, REST and ApolloGraphql, REST and Apollo
Graphql, REST and Apollo
Christoffer Noring
 
Angular 2 introduction
Angular 2 introductionAngular 2 introduction
Angular 2 introduction
Christoffer Noring
 
React lecture
React lectureReact lecture
React lecture
Christoffer Noring
 
Angular modules in depth
Angular modules in depthAngular modules in depth
Angular modules in depth
Christoffer Noring
 

More from 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
 

Recently uploaded

Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
Alison B. Lowndes
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
Elena Simperl
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
Jemma Hussein Allen
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
RTTS
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
Guy Korland
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
Elena Simperl
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
Safe Software
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Thierry Lestable
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Jeffrey Haguewood
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Product School
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
Alan Dix
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
g2nightmarescribd
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Product School
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
ThousandEyes
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
Sri Ambati
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
Prayukth K V
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
Cheryl Hung
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
DianaGray10
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
OnBoard
 

Recently uploaded (20)

Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........Bits & Pixels using AI for Good.........
Bits & Pixels using AI for Good.........
 
When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...When stars align: studies in data quality, knowledge graphs, and machine lear...
When stars align: studies in data quality, knowledge graphs, and machine lear...
 
The Future of Platform Engineering
The Future of Platform EngineeringThe Future of Platform Engineering
The Future of Platform Engineering
 
JMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and GrafanaJMeter webinar - integration with InfluxDB and Grafana
JMeter webinar - integration with InfluxDB and Grafana
 
GraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge GraphGraphRAG is All You need? LLM & Knowledge Graph
GraphRAG is All You need? LLM & Knowledge Graph
 
Knowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and backKnowledge engineering: from people to machines and back
Knowledge engineering: from people to machines and back
 
Essentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with ParametersEssentials of Automations: Optimizing FME Workflows with Parameters
Essentials of Automations: Optimizing FME Workflows with Parameters
 
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdfFIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
FIDO Alliance Osaka Seminar: FIDO Security Aspects.pdf
 
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
Empowering NextGen Mobility via Large Action Model Infrastructure (LAMI): pav...
 
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
Slack (or Teams) Automation for Bonterra Impact Management (fka Social Soluti...
 
Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...Mission to Decommission: Importance of Decommissioning Products to Increase E...
Mission to Decommission: Importance of Decommissioning Products to Increase E...
 
Epistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI supportEpistemic Interaction - tuning interfaces to provide information for AI support
Epistemic Interaction - tuning interfaces to provide information for AI support
 
Generating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using SmithyGenerating a custom Ruby SDK for your web service or Rails API using Smithy
Generating a custom Ruby SDK for your web service or Rails API using Smithy
 
Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...Designing Great Products: The Power of Design and Leadership by Chief Designe...
Designing Great Products: The Power of Design and Leadership by Chief Designe...
 
Assuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyesAssuring Contact Center Experiences for Your Customers With ThousandEyes
Assuring Contact Center Experiences for Your Customers With ThousandEyes
 
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
GenAISummit 2024 May 28 Sri Ambati Keynote: AGI Belongs to The Community in O...
 
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 previewState of ICS and IoT Cyber Threat Landscape Report 2024 preview
State of ICS and IoT Cyber Threat Landscape Report 2024 preview
 
Key Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdfKey Trends Shaping the Future of Infrastructure.pdf
Key Trends Shaping the Future of Infrastructure.pdf
 
UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4UiPath Test Automation using UiPath Test Suite series, part 4
UiPath Test Automation using UiPath Test Suite series, part 4
 
Leading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdfLeading Change strategies and insights for effective change management pdf 1.pdf
Leading Change strategies and insights for effective change management pdf 1.pdf
 

Rxjs vienna