"lodash for async"- Ben Lesh
Eventos del DOM (0 - N)
Mouse events
Keyboard events
Object events
Drag events
Clipboard events
Media events
Entradas de usuario alternativas ( 0 - N)
Eventos del DOM (0 - N)
AJAX ( 1 )
Entradas de usuario alternativas ( 0 - N)
Eventos del DOM (0 - N)
Web Sockets ( 0 - N )
AJAX ( 1 )
Entradas de usuario alternativas ( 0 - N)
Eventos del DOM (0 - N)
Animaciones (cancelable)
Web Sockets ( 0 - N )
AJAX ( 1 )
Entradas de usuario alternativas ( 0 - N)
Eventos del DOM (0 - N)
Sembrar
Cultivar
Calentar
function hacerPalomitasMaiz() {
sembrar("🌰", (cultivo) => {
cultivar(cultivo, (brote) => {
recolectar(brote, (mazorca) => {
calentar(mazorca, (palomitasMaiz) => {
comerPalomitas(palomitasMaiz);
})
})
})
});
}y...
el desgrane?
el transporte?
function hacerPalomitasMaiz() {
sembrar("unaSemillita", function (semilla) {
cultivar(semilla, function (brote) {
recolectar(brote, function (mazorca) {
desgranar(mazorca, function (granos) {
calentar(mazorca, function (palomitasMaiz) {
yOtraCosa(palomitasMaiz, function (x) {
yOtraOtraCosa(x, function (y) {
yOtraOtraCosa(y, function (z) {
servirPalomitasMaiz(z);
})
})
})
})
})
})
})
});
}el ...?
function hacerPalomitasMaiz() {
sembrar("unaSemillita", function (cultivo) {
cultivar(cultivo, function (brote) {
recolectar(brote, function () {
calentar(mazorca, function (palomitasMaiz) {
servirPalomitasMaiz(palomitasMaiz);
})
})
})
});
}function hacerPalomitasMaiz() {
sembrar("🌰").then(cultivar)
.then(recolectar)
.then(calentar)
.then(comerPalomitas);
}¿Y ... si quiero parar el proceso?
¿Y ... las demás semillas?
Promesas:
Eventos del DOM (0 - N)
Entradas de usuario Alternativas (0 - N)
AJAX ( single )
Web Sockets (0 - N)
Animaciones (cancelable)
const iterator = semillas.iterator();
while (true) {
try {
var result = iterator.next(); // do it async
} catch (err) {
handleError(err);
break;
}
if (result.done) {
break;
}
var semilla = result.value;
hacerPalomitasMaiz(semilla);
}los iterables no fueron pensados para operaciones asíncronas
(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 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 okError) {
return Promise.resolve('okay');
} else {
throw error;
}
});x.catch(error => {
if (error instanceof okError) {
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 tienen operadores
iterable
.filter(x => x > 10)
.map(x => x * 2)
.forEach(x => console.log(x));Observables tienen operadores !!
Los operadores de los observable difieren de los operadores de los iterables en que los primeros aplican la operación por cada elemento mientras que los segundos a la colección completa
let observable = Rx.Observable.of("🌰", "🌰", "🌰");
observable.mergeMap(sembrar)
.mergeMap(cultivar)
.mergeMap(recolectar)
.mergeMap(calentar)
.subscribe(palomitas => comerPalomitas(palomitas));Programación reactiva
Trata eventos como colecciones
Manipula eventos con operadores
Los observables no van a generar valores hasta que nos subscribimos a él.
Podemos ignorar el futuro ( cancelable)