Uno de los problemas a los que nos enfrentábamos los desarrolladores de JavaScript era a la temida Pirámide de la Muerte ocasionada por varios callbacks, es por eso que tienes que conocer el concepto de las Promesas y cuál es su utilidad
¿Qué es una Promesa o Promise?
La principal idea de esta nueva característica es que una Promesa o Promise es el resultado de una operación asíncrona, la cual se compone de 3 estados diferentes:
- Pending: Es el estado inicial de la promesa
- Fullfilled: Es el estado de una promesa representando una operación satisfactoria
- Rejected: Es el estado de una promesa representando una operación fallida
Una vez que una promesa se cumple o se rechaza, es inmutable (es decir, que nunca puede cambiar de nuevo).
Casos de Uso
Supongamos que queremos construir un pequeño módulo que lee archivos de manera asíncrona, para lo cual tenemos el siguiente código
function readFile(filename, enc){ return new Promise(function (fulfill, reject){ fs.readFile(filename, enc, function (err, res){ if (err) reject(err); else fulfill(res); }); }); }
Usamos la declaración
new Promise();
para construir una nueva promesa, la cual recibe dos parámetros, el primero es para cuando la promesa se haya ejecutado correctamente y el segundo cuando se rechaza, cada vez que la promesa se cumple se ejecuta la función correspondiente inmediatamente
Existe un método del Objeto Promise que facilita más las cosas al momento de crear una Promesa y es
promise.done()
el cual recibe como parámetro la función que se ejecutará una vez que se haya cumplido dicha promesa creada. Por ejemplo:
function readJSON(filename){ return new Promise(function (fulfill, reject){ readFile(filename, 'utf8').done(function (res){ try { fulfill(JSON.parse(res)); } catch (ex) { reject(ex); } }, reject); }); }
Una de las cosas que se pueden hacer con las promesas es lograr transformarlas por medio de otra operación esta, puede ser asíncrona o síncrona en su defecto. Las promesas cuentan con su propio método para su trasformación y las operaciones de encadenamiento
Retomando el ejemplo anterior quedaría de la siguiente manera
function readJSON(filename){ return readFile(filename, 'utf8').then(function (res){ return JSON.parse(res) }) }
Ya que
JSON.parse()
es una función podremos reescrbirlo de la siguiente manera
function readJSON(filename){ return readFile(filename, 'utf8').then(JSON.parse); }
Como te darás cuenta hay muchas cosas que se pueden lograr con esta nueva característica de JavaScript, si quieres aprender más sobre este tema, puedes consultar la documentación oficial del proyecto.