Empresas
Empregos
  • Sobre nós
  • Soluções
    • Publicação de vagas
      Publique sua vaga e receba candidatos qualificados em 48h.
    • Avaliações de candidatos
      Mais de 500 testes técnicos e psicológicos, mais anti-fraude.
    • Headhunting
      Busca executiva personalizada do início ao fim.
    • Folha de Pagamento + EOR
      Dispersão de folha e EOR em mais de 15 países da LATAM.
  • Preços
  • Empregos

0

198
Visualizações
¿Cómo evitar las llamadas a la API en un ciclo de temporizador de un minuto cuando se está en el proceso de cierre de sesión de una aplicación web?

En mi aplicación Ionic/Angular, tengo un temporizador observable de 60 segundos que solo emite la hora actual sincronizada con la hora del servidor. Cada minuto obtengo permisos, configuraciones, etc. Paso un token con cada solicitud. Al cerrar la sesión, revoco el token. Aquí hay una muestra de cómo se ve mi lógica.

Nota al margen: también hay una función en la que un usuario puede "cambiar el tipo de inicio de sesión" donde puede "convertirse" en administrador, por ejemplo, y este proceso también puede desencadenar una circunstancia similar.

 this.clientTimeSub = this.timeService.clientTime .pipe(takeUntil(this.logoutService.isLoggingOut$)) .subscribe(async (latestClientTime) => { this.clientTime = { ...latestClientTime }; // if client time just rolled over to a new minute, update settings if ( this.clientTime?.time?.length === 7 && this.clientTime?.time?.slice(-1) === '0' ) { await updateSettings(); await updatePermissions(); // etc // These functions will: // (1) make an api call (using the login token!) // (2) update app state // (3) save to app storage } });

Cuando estoy saliendo de la aplicación, hay una pequeña ventana de tiempo en la que podría estar en medio del envío de varias solicitudes de API y el token ya no es válido, debido a que el temporizador avanza a un nuevo minuto justo cuando estaba saliendo. o cerca de ella. Luego se me presenta un 401: No autorizado en medio del cierre de sesión.

Mi solución ingenua fue decirle a este observable que detuviera la propagación cuando un sujeto o un sujeto de comportamiento activa un valor que le dice a este observable que se está desconectando, puede ver esto aquí .pipe(takeUntil(this.logoutService.isLoggingOut$)) .

Luego, en cualquiera de mis métodos de cierre de sesión, usaría:

 logout() { this.isLoggingOut.next(true); ... // Logout logic here, token becomes invalidated somewhere here // then token is deleted from state, etc, navigate back to login... ... this.isLoggingOut.next(false); }

En esa pequeña ventana de tiempo de cierre de sesión, el temporizador del cliente debe dejar de activarse y verificar si se ha trasladado a un nuevo minuto, evitando más llamadas a API que pueden no estar autenticadas.

¿Hay alguna manera de evitar fácilmente que suceda este problema o hay una falla en mi lógica que puede estar causando este problema?

Agradezco cualquier ayuda, gracias!

about 4 years ago · Juan Pablo Isaza
1 Respostas
Responde à pergunta

0

En primer lugar, no es la mejor manera de usar async-await junto con RXJS. Es porque RXJS como una forma reactiva de programación funcional, tiene sus operadores "canalizables" para que pueda "encadenar" todo.

Entonces, en lugar de tener una lógica para calcular el tiempo en su función de devolución de llamada de suscripción, debería usar, por ejemplo, el operador filter () RXJ, y en lugar de usar await-async, puede usar el operador switchMap y dentro de él, use forkJoin o operador concat.

 this.timeService.clientTime .pipe( // Filter stream (according to your calculation) filter((time) => { // here is your logic to calculate if time has passed or whatever else you are doing // const isValid = ... return isValid; }), // Switch to another stream so you can call api calls // Here with "from" we are converting promises to observables in order to be able to use magic of RXJS switchMap(_ => forkJoin([from(updateSettings), from(updatePermissions)])), // Take until your logout takeUntil(this.logoutService.isLoggingOut$) ).subcribe(([updateSettings, updatePermissions]) => { // Basically your promises should just call API services, and other logic should be here // Here you can use // (2) update app state // (3) save to app storage })

Si divide acciones como en mi ejemplo, en sus promesas simplemente llama a las llamadas API para actualizar lo que esté haciendo, luego, cuando termine, en la devolución de llamada de suscripción puede actualizar el estado de la aplicación, guardar en el almacenamiento de la aplicación, etc. Entonces puede tener 2 escenarios aquí:

  1. Las llamadas api de las promesas, todavía están en progreso. Si activa el cierre de sesión mientras tanto, takeUntil lo hará y no actualizará el estado de la aplicación, etc.
  2. Si se realizan ambas llamadas Api de las promesas, se encuentra en un bloque de devolución de llamada de suscripción y si es solo un código sincrónico (con suerte), se realizará. Y luego se puede ejecutar el código asíncrono (su temporizador ahora puede emitir el siguiente valor, se trata de Event Loop en javascript)
about 4 years ago · Juan Pablo Isaza Relatório
Responde à pergunta
Encontrar trabalhos remotos

Descubra a nova forma de encontrar um emprego!

melhores empregos
Principais categorias de trabalho
Empresas
Postar vaga Preços Comercial
Jurídico
Termos e Condições Política de privacidade
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomende algumas ofertas para mim
Preciso de ajuda