IIC2513-2021-2 / project

Repositorio oficial para el proyecto del curso IIC2513, período 2021-2
32 stars 1 forks source link

generateToken asíncrono vs síncrono #44

Open benjavicente opened 2 years ago

benjavicente commented 2 years ago

¿Por qué generan un JWT lo hacen con una promesa? Tenía entendido que las promesas se usaban cuando uno se comunicaba con un proceso externo, como al realizar requests a la web o a la bdd 🤔

function generateToken(user) {
  return new Promise((resolve, reject) => {
    jwtgenerator.sign(
      { sub: user.id },
      process.env.JWT_SECRET,
      { expiresIn: '1h' },
      (err, tokenResult) => (err ? reject(err) : resolve(tokenResult)),
    );
  });
}
sivicencio commented 2 years ago

Hola @benjavicente. Disculpa la demora en responder.

Las promesas se utilizan cada vez que se necesite realizar una operación asíncrona (donde es incierto en qué momento se dispondrá del resultado), y en general involucran un proceso externo "avisando" que el resultado está listo (por medio del message queue dentro del contexto del event loop). Los ejemplos de requests y acceso a la BD son correctos, pero no son los únicos. Por ejemplo, setTimeout es otro ejemplo simple que es asíncrono también.

En este caso, el método jwtgenerator.sign tiene una variante asíncrona si se le pasa un callback (último parámetro en el código que adjuntaste). Si bien se podría utilizar sólo con ese callback, la idea de "envolverlo" en una promesa utilizando new Promise((resolve, reject) => {}) es para poder utilizarlo de forma más simple con await más adelante. Es un ejemplo típico de cómo "promisificar" una operación asíncrona con callbacks.

benjavicente commented 2 years ago

Es un ejemplo típico de cómo "promisificar" una operación asíncrona con callbacks.

Lo que no me había quedado claro era el porqué esta es una operación asíncrona, porque parece que no requiere de nada externo o similar donde el thead principal pueda seguir haciendo cosas mientras espera a finalizar.

Viendo el código llegué a esta función que me llevó al módulo crypto que menciona en algunas partes código asíncrono, así que supongo que lo que pasa es que la mayoría se ejecuta sincrónicamente y que debe haber una parte que no se ejecuta en JS 🤔