Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

141
Vistas
Cómo acceden las devoluciones de llamada a los métodos

Me pregunto cómo podemos usar res.render dentro de una devolución de llamada

 function getUsers(cb){ fs.readFile('data.json', 'utf8', (err, data) => { if (err) return cb(err); const users = JSON.parse(data); return cb(null, users); }); } app.get('/', (req,res) => { getUsers((err,users) =>{ if(err){ res.render('error', {error:err}) } else{ res.render('index', {title: "users", users: users.users}); } }) });

Porque cuando pasamos la devolución de llamada, Callstack se carga con la función getUsers (cb), y ya no estamos dentro de la ruta, entonces, ¿cómo la devolución de llamada está usando el método res.render? ¿Y cómo sé en el futuro, qué valores son accesibles para las devoluciones de llamada?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

Las funciones/devoluciones de llamada en línea como las que está usando aquí pueden ver el alcance de la función principal y todas sus variables y argumentos. Esto se conoce como el "alcance léxico".

Si la devolución de llamada no estaba en línea, entonces no podía ver esas variables/argumentos porque la función se declararía en un ámbito diferente.

Entonces, esta es la razón por la que la devolución de llamada en línea para readFile() que ha declarado puede acceder a cb(...) y, de manera similar, la devolución de llamada en línea que pasa a getUsers() puede acceder a req y res . Esos son todos los argumentos en el ámbito principal.

Tenga en cuenta que el acceso a estas variables/argumentos principales no se realiza desde la pila de llamadas. Esto es del ámbito léxico .


Este acceso a res.render() solo funciona porque la función se declara dentro del ámbito léxico donde se puede acceder a res . Si su ruta fue declarada así en su lugar:

 function getUsersCallback(err, users) { if(err){ res.render('error', {error:err}) } else{ res.render('index', {title: "users", users: users.users}); } } app.get('/', (req,res) => { getUsers(getUsersCallback); });

Entonces esto no funcionaría porque la función de devolución de llamada no está declarada en un ámbito léxico que tiene acceso a req y res .


Tenga en cuenta que los argumentos de función y las variables locales en Javascript se almacenan en objetos de alcance, no en la pila de llamadas como lo estarían en un lenguaje como C/C++. Esto se debe a un montón de razones, una de las cuales es que la vida útil del alcance de una función puede extenderse más allá de cuando la función regresa (debido a los cierres) y para que los alcances se puedan encadenar para que el intérprete pueda buscar cosas en el alcance principal ( para implementar el "ámbito léxico" que implementa el lenguaje).

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda