Este documento presenta una introducción a los generadores en JavaScript. Explica qué son los generadores, cómo permiten la suspensión y reanudación de la ejecución de funciones, y cómo se usan las palabras clave yield y yield* dentro de funciones generadoras. También discute cómo los generadores pueden usarse para evaluación perezosa, secuencias infinitas y flujo de control asíncrono, y presenta algunas librerías como Co y Thunks que facilitan el uso de generadores para este tipo de tareas. Finalmente, introduce el framework Koa como una alternativa a
1. Del infierno al cielo
Raúl Requero
@rrequeroMADRID · NOV 27-28 · 2015
2. MADRID · NOV 27-28 · 2015
¿Quien soy?
Raúl Requero García
Fullstack developer
@rrequero
3. MADRID · NOV 27-28 · 2015
Recursos
https://github.com/rrequero/resources-
delInfiernoAlCielo
4. MADRID · NOV 27-28 · 2015
var fs = require('fs');
fs.readFile('file1.txt', 'utf8', function(err, data1) {
if (err) { return console.log(err); }
fs.readFile('file2.txt', 'utf8', function(err, data2) {
if (err) { return console.log(err);}
fs.readFile('file3.txt', 'utf8', function(err, data3) {
if (err) { return console.log(err); }
fs.writeFile("completeFile.txt", data1+data2+data3, function(err) {
if (err) { return console.log(err); }
console.log("File saved!");
});
});
});
});
5. MADRID · NOV 27-28 · 2015
var fs = require('fs');
fs.readFile('file1.txt', 'utf8', function(err, data1) {
if (err) { return console.log(err); }
fs.readFile('file2.txt', 'utf8', function(err, data2) {
if (err) { return console.log(err);}
fs.readFile('file3.txt', 'utf8', function(err, data3) {
if (err) { return console.log(err); }
fs.writeFile("completeFile.txt", data1+data2+data3, function(err) {
if (err) { return console.log(err); }
console.log("File saved!");
});
});
});
});
6. MADRID · NOV 27-28 · 2015
Posibles soluciones
Promises
var promise = readFile('file1.txt', 'utf8');
promise.then(function(content){
console.log(content);
});
promise.catch(function(error){
console.error(error);
});
7. MADRID · NOV 27-28 · 2015
Generadores
http://www.ecma-international.org/ecma-262/6.0/
8. MADRID · NOV 27-28 · 2015
¿Que son?
Los generadores son funciones que permiten tener múltiples puntos de entrada para la
suspensión y reanudación de la ejecución.
Los generadores son subtipos de Iterator que incluyen el métodos next.
Este comportamiento es posible utilizando funciones especiales que devuelven un objeto
Generador. ( function * (...) ). Dentro de la función se usan las palabras claves yield y yield*
para devolver u obtener un valor y throw para lanzar un error.
Una función Generador al ejecutarse comienza en estado suspendido y no comienza su
ejecución hasta que se ejecuta por primera vez el método next del objeto Generador devuelto
al ejecutar la función
9. MADRID · NOV 27-28 · 2015
¿Para que no usarlos?
El rendimiento empeora
10. MADRID · NOV 27-28 · 2015
¿Para que usarlos?
Lazy evaluation (Evaluación perezosa)
Secuencias infinitas
Flujo de control asincrono
16. MADRID · NOV 27-28 · 2015
¿Que es?
Web framework
Creado por el equipo que creo ExpressJS
Usa generadores (Basado en la librería co)
Mejor manejo de los errores
Core muy simple, no incorpora middlewares
17. MADRID · NOV 27-28 · 2015
Diferencias entre Koa y Express
Funcionalidad Koa Express
Middleware Kernel X X
Routing X
Templating X
Sending Files X
JSONP X
18. MADRID · NOV 27-28 · 2015
Diferencias entre Koa y Express
Funcionalidad Koa Express
Middleware Kernel X X
Routing (koa-router) X
Templating (koa-render) X
Sending Files (koa-send) X
JSONP (koa-jsonp) X
19. MADRID · NOV 27-28 · 2015
Primer app con Koa
var koa = require('koa');
var app = koa();
app.use(function *(){
this.body = 'Hello World';
});
app.listen(3000);
20. MADRID · NOV 27-28 · 2015
Cascading
Mismo sistema de middlewares que otros frameworks.
Podemos lograr ‘true middleware’
21. MADRID · NOV 27-28 · 2015
Error handling
Por defecto todos los errores se imprimen en stderr
Si NODE_ENV=test los errores no salen por stderr.
app.on('error', function(err, ctx){
log.error('server error', err, ctx);
});
22. MADRID · NOV 27-28 · 2015
Context
Encapsula los objetos request y response
Se crea una por cada request
Incluye métodos de ayuda
Se accede a él a traves de this
23. MADRID · NOV 27-28 · 2015
Context API
ctx.req: Objeto request
ctx.res: Objeto response
ctx.state: Espacio de nombres recomendado para
pasar información entre los middlewares
ctx.app: Referencia a la instancia de la aplicación
24. MADRID · NOV 27-28 · 2015
Context API
Cookies:
Koa usa la librería: https://github.com/jed/cookies
∘ ctx.cookies.get(name, [options]): Obtener una cookie por nombre
∘ ctx.cookies.set(name, value, [options]): Crear una cookie
25. MADRID · NOV 27-28 · 2015
Context API
Throw:
Koa usa la librería: (http-errors)
https://github.com/jshttp/http-errors
∘ ctx.throw([msg], [errorCode],[properties])
Ej: this.throw(403, ‘Not authorized’)
26. MADRID · NOV 27-28 · 2015
Context API
Assert:
Koa usa la librería: (http-assert)
https://github.com/jshttp/http-assert
∘ ctx.assert(value, [msg], [errorCode], [properties])
Ej: this.assert(this.user, ‘Not authorized’, 403)
27. MADRID · NOV 27-28 · 2015
Context API
Alias:
Existen alias para los atributos más utilizados
Request:
- header
- headers
- method
- url
- ip
- etc...
Response:
- body
- status
- message
- type
- length
- etc...
28. MADRID · NOV 27-28 · 2015
Middlewares
Koa-router: https://github.com/alexmingoia/koa-router
Koa-body-parser:https://github.com/koajs/bodyparser
Koa-render: https://github.com/queckezz/koa-views
29. MADRID · NOV 27-28 · 2015
Middlewares
koa-mount: https://github.com/koajs/mount
koa-session: https://github.com/koajs/session
koa-static:https://github.com/koajs/static
koa-logger:https://github.com/koajs/logger (dev)