SlideShare a Scribd company logo
1 of 100
Download to read offline
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 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
 
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
 
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
 

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

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 (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

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonetsnaman860154
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024The Digital Insurer
 
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
 
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
 
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
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdfChristopherTHyatt
 
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
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationMichael W. Hawkins
 
🐬 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
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
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
 
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
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProduct Anonymous
 
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
 
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
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherRemote DBA Services
 

Recently uploaded (20)

How to convert PDF to text with Nanonets
How to convert PDF to text with NanonetsHow to convert PDF to text with Nanonets
How to convert PDF to text with Nanonets
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 
Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024Partners Life - Insurer Innovation Award 2024
Partners Life - Insurer Innovation Award 2024
 
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...
 
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
 
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
 
Evaluating the top large language models.pdf
Evaluating the top large language models.pdfEvaluating the top large language models.pdf
Evaluating the top large language models.pdf
 
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
 
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
 
GenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day PresentationGenCyber Cyber Security Day Presentation
GenCyber Cyber Security Day Presentation
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
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
 
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
 
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemkeProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
ProductAnonymous-April2024-WinProductDiscovery-MelissaKlemke
 
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...
 
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
 
Strategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a FresherStrategies for Landing an Oracle DBA Job as a Fresher
Strategies for Landing an Oracle DBA Job as a Fresher
 

Rxjs vienna