Las Promesas en JavaScript
Las Promesas en JavaScript
< Blog
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 1/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
checkWatcher('buenos aires')
.then(weather => {
if (weather === 'well') {
return checkFlights('buenos aires');
}
throw new Error('el clima es malo');
})
.then(flights => buyTicket(flights[0]))
.then(ticket => {
console.log('ticket nº %d', ticket.number);
})
.catch(error => console.error(error));
Ese ticket que nos dieron es nuestra promesa, ese ticket nos indica que
eventualmente vamos a tener nuestra comida, pero que todavía no la tenemos.
Cuando llaman a ese número para que vayamos a buscar la comida entonces
quiere decir que la promesa se completó. Pero resulta que una promesa se puede
completar correctamente o puede ocurrir un error, ¿Qué error puede ocurrir en
nuestro caso? Por ejemplo puede pasar que el restaurante no tenga más comida,
entonces cuando nos llamen con nuestro número pueden pasar dos cosas.
ticket
.then(food => eatFood(food))
.catch(error => getRefund(error));
Share 319 Twittear Share
30
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 2/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
setTimeout(
() => number > 5
? resolve(number)
: reject(new Error('Menor a 5')),
1000
);
});
promise
.then(number => console.log(number))
.catch(error => console.error(error));
Esto nos lleva a hablar del estado de una promesa, básicamente existen 3
posibles estados.
Pendiente
Resuelta
Share
30 Rechazada Share 319 Twittear
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 3/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
Recibiendo parámetros
setTimeout(
() => number > expected
? resolve(number)
: reject(new Error('número menor al esperado'));
delay
);
});
}
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 4/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
¿Qué ocurre si una función que queremos utiliza callbacks? ¿Cómo podríamos
usarla con promesas? Muy simple, podemos crear una versión con promesas de
esa función haciendo lo que hicimos arriba. Por ejemplo leer una archivo usando
el módulo fs de Node.js.
function readFile(path) {
return new Promise((resolve, reject) => {
fs.readFile(path, 'utf8', (error, data) => {
if (error) return reject(error);
return resolve(data);
});
});
}
readFile('./archivo.txt')
.then(data => console.log(data))
.catch(error => console.error(error));
De esta forma creamos una función que lee un archivo del disco como utf8 y si
no ocurre ningún error entonces se resuelve, si hay un error es rechazada.
Encadenando promesas
Básicamente nos evita anidar código, en vez de eso una promesa puede devolver
otra
30
promesa y llamar al 319
Share siguiente .then de la Twittear
cadena. Veamos un ejemplo,
Share
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 5/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
Como vemos dentro de nuestro primer callback tenemos que validar el primer
error, luego llamar a otra función que obtiene los datos de verdad, y si tenemos
que ir anidando muchas funciones que usen callback podemos llegar a tener
muchos niveles de indentación. Con promesas esto quedaría así:
readFile('./archivo.txt')
.then(readFile)
.then(data => console.log(data))
.catch(error => console.error(error));
ejecuta el primer .then , este ejecuta un nuevo readFile , como .then recibe el
path al nuevo archivo y readFile solo recibe un argumento (el path) entonces
podemos pasar directamente readFile y la promesa se encarga de ejecutarlo.
Este segundo readFile devuelve una nueva promesa, otra vez si hay un error se
ejecuta el .catch , pero si podemos leer el archivo sin problema entonces se
muestra en consola.
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 6/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
sea una promesa, un objeto, un string, un número o cualquier otro tipo de datos.
Por ejemplo:
readFile('./archivo.txt.')
.then(resolve)
.then(readFile)
.then(data => console.log(data))
.catch(error => console.error(error));
La función resolve que exporta el módulo path nos permite armar la ruta
absoluta a un archivo y devuelve un string, gracias a los .then podemos hacer
una función que recibe el fileName del primero archivo y luego devuelve esta
ruta absoluta la cual llega como parámetro al segundo .then , el cual usa esa ruta
para leer el segundo archivo y devuelve una promesa que se resuelve con el
contenido de este. Y como siempre si en algún momento hay ocurre un error se
ejecuta el .catch .
Promesas en paralelo
Hasta ahora solo vimos como ejecutar una función asíncrona a la vez (en serie),
sin embargo es muy común que necesitemos realizar múltiples al tiempo, por
ejemplo para obtener varios datos de un API. Para eso la clase Promise tiene un
método estático llamado Promise.all el cual recibe un único parámetro, una lista
de promesas las cuales se ejecutan simultáneamente, si alguna de estas es
rechazadas entonces toda la lista lo es, pero si todas se resuelven entonces
podemos obtener una lista de todas las respuestas.
Promise.all([readFile('./archivo1.txt'), readFile('./archivo2.txt')])
.then(data => data.map(resolve))
.then(data => Promise.all(data.map(readFile)))
.then(finalData => console.log(finalData))
.catch(error => console.error(error));
Share 319 Twittear Share
30
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 7/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
archivo, los convertimos entonces a una nueva lista de rutas absolutas ( resolve )
y usamos esas rutas para crear una nueva lista de promesas a partir de readFile .
Carrera de promesas
Promise.race([readFile('./archivo1.txt'), readFile('./archivo2.txt'])
.then(resolve)
.then(readFile)
.then(data => console.log(data)
.catch(error => consol.error(error));
Como vemos en el ejemplo otra vez leemos 2 archivos, pero esta vez solo
obtenemos el contenido de 1, el que primero se termine de leer. O si alguno se
completó con un error entonces entramos al catch y mostramos el error en
consola.
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 8/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
Promise.resolve()
.then(() => {
// acá podemos hacer lo que queramos
});
Otra opción es pasarle un parámetro a resolve para que nuestro primer then
Promise.resolve('./archivo1.txt')
.then(resolve)
.then(readFile)
.then(data => console.log(data))
.catch(error => console.error(error));
Como vemos iniciamos la cadena con un string y desde ahí obtenemos el path
absoluto, leemos el archivos y lo mostramos en consola.
¿Para qué nos sirve esto? Si tenemos una función síncrona que queremos
resolver mediante promesas podríamos si da un error devolver Promise.reject
Conclusiones
Share 319 Twittear Share
30
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 9/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
Trabajar con promesas nos facilita mucho el control de ujos de datos asíncronos
en una aplicación, además las promesas son la base para luego poder
implementar características más avanzadas de JavaScript como Async/Await
que nos facilitan aún más nuestro código.
Sergio Daniel
@sergiodxa 20772 Puntos hace 2 años Todas sus entradas
Suma tu comentario +2
Share 319 Twittear Share
30
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 10/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
Sólo dejo el código de la parametrizació de la promesa en la función que tiene una errata, lo pongo aquí: (y)
setTimeout(
() => number > expected
? resolve(number)
: reject(newError('número menor al esperado')),
delay
)
});
}
sergiodxa 2 años
Pues usando async/await, si usas promesas sin async/await entonces tenés que seguir el ujo de
1
los then , no podés salirte del ujo asíncrono.
sergiodxa un año
Exactamente igual,
Share 319 aunque dependes de que el Twittear
navegador lo soporte (tip: todos losShare
navegadores
30 1
modernos soportan promesas desde hace tiempo).
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 11/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
fetch('https://datosDeServidor/Usuarios')
.then(r =>r.json());
.then(data =>{
otrafuncion(data);
diferenteFuncion(data);
//y aqui irán todos los metodos donde necesite la información del que pido del
servidor?
})sdsds
functionotrafuncion(usuario){
for(let i=0; usuario.length; i++){
console.log(usuario[i]["name"])
}
}
functiondiferenteFuncion(d){
console.log("otra funcionalidad");
}
en ese caso uso Fetch() para la petición el cual devuelve una promesa … pero es esa la forma mas optima de
trabajar con promesas?
Vktor un año
0 esos sdsds no son intencionales, no me explico como los dejé ahí jajaj
sergiodxa 2 años
1 Hola, fue un error durante un cambio interno, ya esta todo arreglado 😃
Muy bueno el artículo. Como puedo usar este ejemplo con setState de react para actualizar varias
instancias de una progress bar? el caso concreto es sobreTwittear
Share 319 un upload de varios cheros usando
Sharerebase.
30
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 12/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
Gracias!
Entradas relacionadas
15
No hay nada más común en este mundo que gente talentosa viendo Net ix. Personas con
capacidades increíbles que ignoran que las tienen, o pe
cesarfajardo
13
Todos los jugadores nos hemos sumergido en las historias que nos contaron nuestros
videojuegos favoritos, incluso llegamos a sentir que esos
PurpleDoll
5
ricardo-velasquez
Hola
Share 319 Twittear Share
30 Cambiar idioma
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 13/14
16/3/2019 Qué son y cómo funcionan las promesas en JavaScript
Español
Ver todas
Platzi
Share 319 Twittear Share
30
https://platzi.com/blog/que-es-y-como-funcionan-las-promesas-en-javascript/ 14/14