Cómo usar promesas y esperar con funciones basadas en devolución de llamadas de Node.js

 

 

 

La mayoría de las API de Node.js se crearon en una época en la que las promesas aún no existían y utilizan una solución basada en devoluciones de llamadas.

La API típica de Node.js funciona así:

doSomething(param, (err, result) = {})

Esto también se aplica a las bibliotecas. Un ejemplo es node-redis, y mientras trabajaba con él en un proyecto, en algún momento tuve la necesidad de eliminar todas las devoluciones de llamadas, porque tenía demasiados niveles de devoluciones de llamadas anidados entre sí, un escenario perfecto de “infierno de devoluciones de llamadas”.

Además, a veces es absolutamente necesario evitar las devoluciones de llamadas porque es necesario devolver desde la función el resultado de una llamada a la función. Si se devuelve en una devolución de llamada, la única forma de obtener el resultado sería enviarlo de vuelta con una función y la parte que realiza la devolución de llamada continúa:

 

const myFunction = () = { doSomething(param, (err, result) = { return result //can't return this from `myFunction` })}
const myFunction = callback = { doSomething(param, (err, result) = { callback(result) //no })}myFunction(result = { console.log(result)})

Hay una solución fácil.

Una solución proporcionada por el propio Node.js.

Podemos “promisar” cualquier función que no admita promesas (y como consecuencia la sintaxis async/await) importando promisifydesde el módulo principal de Node.js util:

const { promisify } = require('util')

Luego creamos nuevas funciones usándolo:

const ahget = promisify(client.hget).bind(client)const asmembers = promisify(client.smembers).bind(client)const ahkeys = promisify(client.hkeys).bind(client)

Mira cómo agregué la aletra para significar async .

Ahora podemos cambiar este ejemplo de “infierno de devolución de llamadas”:

client.hget(`user:${req.session.userid}`, 'username', (err, currentUserName) = { client.smembers(`followers:${currentUserName}`, (err, followers) = { client.hkeys('users', (err, users) = { res.render('dashboard', { users: users.filter((user) = user !== currentUserName followers.indexOf(user) === -1) }) }) })})

en un lugar mucho más limpio: Blog sobre productos para la limpieza del hogar

const currentUserName = await ahget(`user:${req.session.userid}`, 'username')const followers = await asmembers(`followers:${currentUserName}`) const users = await ahkeys('users')res.render('dashboard', { users: users.filter((user) = user !== currentUserName followers.indexOf(user) === -1)})

Esto es óptimo cuando se usa una función a la que no se tiene acceso, como en este caso donde uso una biblioteca de terceros.

Bajo el capó, promisify envuelve la función en una promesa y la devuelve.

También puedes hacer esto manualmente, devolviendo una promesa desde una función y luego usándola con async/await:

const handleLogin = (req, user) = { return new Promise((resolve, reject) = { req.login(user, (err) = { if (err) { return reject({ error: true, message: err, }) } return resolve({ success: true, }) }) })}//...const resultLogin = await handleLogin(req, user)

Tips de Node.js




Tal vez te puede interesar:

  1. Cómo gestionar la carga de archivos en Node.js
  2. Cómo obtener los nombres de todos los archivos en una carpeta en Node
  3. Cómo renombrar archivos de forma masiva en Node.js
  4. Cómo comprobar la versión actual de Node.js en tiempo de ejecución

Cómo usar promesas y esperar con funciones basadas en devolución de llamadas de Node.js

Cómo usar promesas y esperar con funciones basadas en devolución de llamadas de Node.js

La mayoría de las API de Node.js se crearon en una época en la que las promesas aún no existían y utilizan una solución basada en devoluciones de llamadas

programar

es

https://aprendeprogramando.es/static/images/programar-como-usar-promesas-y-esperar-con-funciones-basadas-en-devolucion-de-llamadas-de-node-2326-0.jpg

2024-11-06

 

Cómo usar promesas y esperar con funciones basadas en devolución de llamadas de Node.js
Cómo usar promesas y esperar con funciones basadas en devolución de llamadas de Node.js

Si crees que alguno de los contenidos (texto, imagenes o multimedia) en esta página infringe tus derechos relativos a propiedad intelectual, marcas registradas o cualquier otro de tus derechos, por favor ponte en contacto con nosotros en el mail [email protected] y retiraremos este contenido inmediatamente

 

 

Update cookies preferences