del infierno al cielo

Download Del infierno al cielo

Post on 14-Apr-2017

534 views

Category:

Technology

3 download

Embed Size (px)

TRANSCRIPT

Del infierno al cieloRal Requero@rrequeroMADRID NOV 27-28 2015

Quien soy?

Ral Requero GarcaFullstack developer @rrequero

MADRID NOV 27-28 2015

Recursoshttps://github.com/rrequero/resources-delInfiernoAlCielo

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!"); }); }); });});

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!"); }); }); });});

MADRID NOV 27-28 2015

Posibles solucionesPromises

var promise = readFile('file1.txt', 'utf8');promise.then(function(content){console.log(content);});promise.catch(function(error){console.error(error);});

MADRID NOV 27-28 2015

No resuelven el problema del todo. Siguen existiendo callback en nuestro cdigo.Poner ? encima para decir que no es del todo solucin????

Generadores

http://www.ecma-international.org/ecma-262/6.0/

MADRID NOV 27-28 2015

No resuelven el problema del todo. Siguen existiendo callback en nuestro codigo.

Que son?Los generadores son funciones que permiten tener mltiples puntos de entrada para la suspensin y reanudacin de la ejecucin.Los generadores son subtipos de Iterator que incluyen el mtodos next. Este comportamiento es posible utilizando funciones especiales que devuelven un objeto Generador. ( function * (...) ). Dentro de la funcin se usan las palabras claves yield y yield* para devolver u obtener un valor y throw para lanzar un error.

Una funcin Generador al ejecutarse comienza en estado suspendido y no comienza su ejecucin hasta que se ejecuta por primera vez el mtodo next del objeto Generador devuelto al ejecutar la funcinEjemplo

MADRID NOV 27-28 2015

yield* se utiliza para llamar a otra funcion generador y que se siga llamando a next normal sin necesiada de ver el valor.

function* g1() { yield 2; yield 3; yield 4;}

function* g2() { yield 1; yield* g1(); yield 5;}

var iterator = g2();

console.log(iterator.next()); // { value: 1, done: false }console.log(iterator.next()); // { value: 2, done: false }console.log(iterator.next()); // { value: 3, done: false }console.log(iterator.next()); // { value: 4, done: false }console.log(iterator.next()); // { value: 5, done: false }console.log(iterator.next()); // { value: undefined, done: true }

Para que no usarlos?El rendimiento empeoraEjemplo

MADRID NOV 27-28 2015

ops/segundo

Para que usarlos?Lazy evaluation (Evaluacin perezosa)Secuencias infinitasFlujo de control asincrono

MADRID NOV 27-28 2015

Ensear ejemplo de infinite con fibonacci

Secuencias infinitasEjemplo

MADRID NOV 27-28 2015

Ejecutar fichero asyncControlFlow/io.js

Flujo de control asncronoEjemplo

MADRID NOV 27-28 2015

Ejecutar fichero asyncControlFlow/io.js

Libreras disponiblesCo: https://www.npmjs.com/package/co

Thunks: https://www.npmjs.com/package/thunks

MADRID NOV 27-28 2015

CoJS: Soporta promesas, generadores, thunks, etc. Las promesas no es necesario wrapearlas

var thunks = require('thunks')();var fs = require('fs');var co = require('co');

var readFile = thunks.thunkify(fs.readFile);var writeFile = thunks.thunkify(fs.writeFile);

co(function* (){try{var data1 = yield readFile('file1.txt', 'utf8');var data2 = yield readFile('file2.txt', 'utf8');var data3 = yield readFile('file3.txt', 'utf8'); yield writeFile('completeFileSequential.txt', data1+data2+data3);console.log(File saved!);}catch(e){console.log(e);}});

MADRID NOV 27-28 2015

MADRID NOV 27-28 2015

Que es?Web frameworkCreado por el equipo que creo ExpressJSUsa generadores (Basado en la librera co)Mejor manejo de los erroresCore muy simple, no incorpora middlewares

MADRID NOV 27-28 2015

Diferencias entre Koa y ExpressFuncionalidadKoaExpressMiddleware KernelXXRoutingXTemplatingXSending FilesXJSONPX

MADRID NOV 27-28 2015

Diferencias entre Koa y ExpressFuncionalidadKoaExpressMiddleware KernelXXRouting(koa-router)XTemplating(koa-render)XSending Files(koa-send)XJSONP(koa-jsonp)X

MADRID NOV 27-28 2015

Primer app con Koavar koa = require('koa');var app = koa();

app.use(function *(){ this.body = 'Hello World';});

app.listen(3000);

MADRID NOV 27-28 2015

CascadingMismo sistema de middlewares que otros frameworks.

Podemos lograr true middlewareEjemplo

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

Error handlingPor 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);});

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

ContextEncapsula los objetos request y response

Se crea una por cada request

Incluye mtodos de ayuda

Se accede a l a traves de this

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

Context APIctx.req: Objeto request

ctx.res: Objeto response

ctx.state: Espacio de nombres recomendado para pasar informacin entre los middlewares

ctx.app: Referencia a la instancia de la aplicacin

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

Context APICookies:Koa usa la librera: https://github.com/jed/cookies

ctx.cookies.get(name, [options]): Obtener una cookie por nombre

ctx.cookies.set(name, value, [options]): Crear una cookie

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

Context APIThrow:Koa usa la librera: (http-errors)https://github.com/jshttp/http-errorsctx.throw([msg], [errorCode],[properties])Ej: this.throw(403, Not authorized)

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

Context APIAssert:Koa usa la librera: (http-assert) https://github.com/jshttp/http-assertctx.assert(value, [msg], [errorCode], [properties])Ej: this.assert(this.user, Not authorized, 403)

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

Context APIAlias:Existen alias para los atributos ms utilizados

Request:headerheadersmethodurlipetc...Response:bodystatusmessagetypelengthetc...

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

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

MADRID NOV 27-28 2015

Poner ejemplo de true middeware. El flujo baja y despues vuelve a subir

Mostrar ejemplo de cascading

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)

MADRID NOV 27-28 2015

koa-session. Session by cookiekoa-static: Static file serving middleware.koa-logger: Logar las peticiones

Ejemplo api Ejemplo

MADRID NOV 27-28 2015

??

MADRID NOV 27-28 2015

Muchas gracias!!!

MADRID NOV 27-28 2015