"lodash for async"- Ben Lesh
DOM Events (0 - N)
Mouse events
Keyboard events
Object events
Drag events
Clipboard events
Media events
DOM Events (0 - N)
Alternative user Inputs ( 0 - N)
DOM Events (0 - N)
Alternative user Inputs (0 - N)
AJAX Calls ( single )
DOM Events (0 - N)
Alternative user Inputs (0 - N)
AJAX Calls ( single )
Web Sockets ( 0 - N )
DOM Events (0 - N)
Alternative user Inputs (0 - N)
AJAX Calls ( single )
Web Sockets (0 - N)
Animations (cancellable)
Plant
Cultivate
HeatUp
function doPopCorn() {
plant("🌰", (crop) => {
farm(crop, (brote) => {
recolect(sprout, (corn) => {
heatUp(corn, (popCorn) => {
eatPopCorn(popCorn);
})
})
})
});
}so...
the peeling?
the transportation?
function hacerPalomitasMaiz() {
plant("🌰", function (crop) {
farm(crop, function (sprout) {
recolect(sprout, function (corn) {
peel(corn, function (grain) {
heatUp(grain, function (popoCorn) {
andOtherThing(popoCorn, function (x) {
andOtherThing2(x, function (y) {
andOtherThing3(y, function (z) {
eatPoporCorn(z);
})
})
})
})
})
})
})
});
}the ...?
function hacerPalomitasMaiz() {
sembrar("unaSemillita", function (cultivo) {
cultivar(cultivo, function (brote) {
recolectar(brote, function () {
calentar(mazorca, function (palomitasMaiz) {
servirPalomitasMaiz(palomitasMaiz);
})
})
})
});
}function doPopCorn() {
plant("🌰").then(farm)
.then(recolect)
.then(heatUp)
.then(eatPopoCorn);
}¿and if... I want to stop the process?
¿and ... the other seeds?
Promises are:
DOM Events (0 - N)
Alternative user Inputs (0 - N)
AJAX Calls ( single )
Web Sockets (0 - N)
Animations (cancellable)
const iterator = seeds.iterator();
while (true) {
try {
var result = iterator.next(); // do it async
} catch (err) {
handleError(err);
break;
}
if (result.done) {
break;
}
var seed = result.value;
doPopCorn(seed);
}iterables alone aren't great for async
(iterable turned inside out)
let result = iterator.next();
let value = result.value;observer.next = (value) => doStuff(value)try{
let result = iterator.next();
} catch(err) {
handleError(value)
}observer.error = (error) => handleError(value)let result = iterator.next();
if (result.done){
handleCompletion(value)
break;
}observer.complete= (error) => handleCompletion(value)let iterator = iterable.iterator();observable.observer(observer);let observer = {
next(value) { /*handle next value */},
error(err) { /*handle error */},
complete() { /*handle completion */}
};
let observable = new Observable(observer => {
const token = doAsyncStuff((err, value) => {
if (err) {
observer.error(err);
} else {
observer.next(value);
observer.complete();
}
});
return () => {
cancelAsyncThing(token);
}
});
observable.observer(observer);x.then(handlerFn,errorFn)
Promises
x.subscribe(handlerFn,errorFn, completeFn)
observables
Promises
observables
x.catch(error => {
if (error instanceof Array) {
return Promise.resolve('okay');
} else {
throw error;
}
});x.catch(error => {
if (error instanceof Array) {
return Observable.of('okay');
} else {
throw error;
}
});myObservable.retry(3);
myObservable.retryWhen(errors =>
errors.delay(3000));Promises
observables
x.finally(()=> {
//done
});x.finally(()=> {
//done
});observable
.filter(x => x > 10)
.map(x => x * 2)
.subscribe(x => console.log(x));
Sets have operators
iterable
.filter(x => x > 10)
.map(x => x * 2)
.forEach(x => console.log(x));Observables have operators too!
Operators for observables differ from the operators for the iterables. They apply the operation for each item not the whole collection.
let observable = Rx.Observable.of("🌰", "🌰", "🌰");
observable.mergeMap(plant)
.mergeMap(farm)
.mergeMap(recolect)
.mergeMap(heatUp)
.subscribe(poporCorn => eat(poporCorn));Reactive programming
Treating events as collections
Manipulate sets of events with "operators
Lazy. Observables will not generate values until they are subscribed to
Future can be ignored (unsubscribe)