1
resposta

Como executar uma requisição para o backend a cada 1 minuto

Olá senhores,

Eu não sei se esse é o local mais apropriado para perguntar isso, mas é que já faz vários dias que estou pesquisando e tentando encontrar uma solução e não sei mais o que fazer. Meu problema é o seguinte eu preciso fazer uma requisição para o backend a cada um minuto, a princípio me parecia uma tarefa simples, então eu criei o seguinte código:

  this.ping().pipe(
        repeatWhen(() => interval(60000)), takeUntil(this.ping$)
      ).subscribe();

O método this.ping() monta o Observable da requisição com HttpClient e não tem nada demais e o this.ping$ é apenas um Subject que eu faço um this.ping$.next(true) quando ocorre um erro de autenticação ou o usuário faz logout do sistema parando a execução dessa lógica. O grande problema desse código é que o intervalo aparentemente não é executado a cada 1 minuto caso a main thread do javascript esteja fazendo um processamento pesado, pelo que eu andei lendo o javascript é single thread e da prioridade para executar todas as tarefas síncronas, antes de começar a executar as tarefas assíncronas. Tentei fazer o uso de web workers colocando a lógica acima em um web worker, mas parece que quando acontece um processamento pesado na main thread o intervalo definido no web worker também varia e não é constante (talvez eu tenha feito algo de errado). É possível criar um intervalo para executar uma requisição de 1 em 1 minuto de maneira que esse tempo não varie, independente do quão pesado seja o processamento que está sendo executado na main thread?

1 resposta

Olá, Lucas! Tudo bem?

Nunca precisei lidar com uma situação que necessitasse de tanta precisão, e infelizmente não encontrei uma solução clara para o seu problema.

É difícil porque, como você disse, os processos assíncronos ficam ao fim da fila, aguardando que a Stack esteja vazia antes de serem executados.

Quanto a Web Workers, encontrei os seguintes conteúdos:

Talvez, se realmente você está fazendo algo errado, poderá comparar com esses conteúdos.

E, se encontrar algo mais sobre, por favor, poste aqui!

Bons estudos!