23.08.2018, Functional Tricity
Frontend Developer @Scalac
http://slides.com/ktrz/observables-intro
function myObservable(observer) {
const datasource = new DataSource();
datasource.ondata = (e) => observer.next(e);
datasource.onerror = (err) => observer.error(err);
datasource.oncomplete = () => observer.complete();
return () => {
datasource.destroy();
};
}
function heatWater(cb) {
setTimeout(() => cb('hot water'), 1000)
}
function addBeans(cb) {
setTimeout(() => cb('black coffee'), 1000)
}
function addMilk(cb) {
setTimeout(() => cb('white coffee'), 1000)
}
function ready(item) {
console.log(item, 'ready')
}
let coffee
const makeCoffee = () => heatWater(hotWater => {
ready(hotWater)
addBeans(blackCoffee => {
ready(blackCoffee)
addMilk(whiteCoffee => {
ready(whiteCoffee)
coffee = whiteCoffee
})
})
})
makeCoffee()
function heatWater() {
return new Promise(resolve => setTimeout(() =>
resolve('hot water'), 1000))
}
function addBeans() {
return new Promise(resolve => setTimeout(() =>
resolve('black coffee'), 1000))
}
function addMilk() {
return new Promise(resolve => setTimeout(() =>
resolve('white coffee'), 1000))
}
function ready(item) {
console.log(item, 'ready')
}
const makeCoffee = () => heatWater()
.then(hotWater => {
ready(hotWater)
return addBeans()
})
.then(blackCoffee => {
ready(blackCoffee)
return addMilk()
})
.then(whiteCoffee => {
ready(whiteCoffee)
return whiteCoffee
})
makeCoffee()
.then(ready)
const createDelayedObservable = v => of(v).pipe(delay(1000))
const heatWater = () => createDelayedObservable('hot water')
const addBeans = () => createDelayedObservable('black coffee')
const addMilk = () => createDelayedObservable('white coffee')
function ready(item) {
console.log(item, 'ready')
}
const makeCoffee = () => heatWater()
.pipe(
tap(ready),
switchMap(() => addBeans()),
tap(ready),
switchMap(() => addMilk()),
tap(ready)
)
makeCoffee()
.subscribe(ready)