Início > Programação > Pooling no Javascript com setTimeout

Pooling no Javascript com setTimeout

Havia um serviço java que executava uma tarefa em background e era necessário consultar o estado de execução dessa tarefa periodicamente. Criei um serviço REST para fazer a consulta:

/**
* Dados de verificacao.
**/
@XmlRootElement
public class VerificacaoData{
   private int codigo;
   public VerificacaoData(int codigo) {
      this.codigo = codigo;
   }
}

/**
* Servico de verificacao.
**/
@Path("/tarefa")
public class VerificacaoTarefa {
   @GET
   @Path("/veificarExecucao")
   @Produces(MediaType.APPLICATION_JSON)
   public Verificacao verificar() {
      /* verificacao do status de execucao do servico */
      /* codigo 1: ainda nao ha resposta */
      /* codigo 2: erro */
      /* codigo 3: sucesso */
      VerificacaoData data = ...;
      return data;
   }
}

Utilizei uma técnica de pooling no javascript com o método setTimeout() para fazer chamadas ajax recursivas:

/*
* Verifica a execução da tarefa.
*/
function verificar() {
   var contadorTentativas = 10; /*10 tentativas*/
   var url = '/rest/tarefa/veificarExecucao';
   var modal = criarDialogoVerificacao(contadorTentativas);
   modal.show();
   pollVerificar(url, modal, contadorTentativas);
}

/*
* Verifica recursivamente a execução da tarefa.
*/
function pollVerificar(url, modal, contadorTentativas) {
   var codVerificacaoPeriodica = 1;
   var codErro = 2;
   $.ajax({
      url : url,
      async: false,
      success: function(data) {
              if(data.codigo == codVerificacaoPeriodica){
                  /* verificacao periodica */
                  if (contadorTentativas > 0) {
                     $('#contador').html(contadorTentativas);
                     var acao = function () {
                        /* recursao */
                        pollVerificar(url, modal, contadorTentativas-1) 
                     };
                     setTimeout(acao, 1000);
                  } else {
                     /* quantidade maxima de tentativas alcancada */
                     modal.dialog('destroy');
                     var modalErro = criarDialogoVerificacao();
                     modalErro.show();
                  }
               } else if (data.codigo == codErro) {
                    /* falha na verificacao */
                    modal.dialog('destroy');
                    var modalErro = criarDialogoVerificacao();
                    modalErro.show();
               } else {
                    /* sucesso */
                    modal.dialog('destroy');
                    var modalSucesso = criarDialogoSucesso();
                    modalSucesso.show();
               }
            },
      error: function() {
             modal.dialog('destroy');
             var modalErro = criarDialogoVerificacao();
             modalErro.show();
      }
   });
}

function criarDialogoVerificacao(contadorTentativas) {
   var div = '<div title="Verificando tarefa..." >'
      + '<div id="contador">' + contadorTentativas + '</div></div>';
   return $(div).dialog({
      modal : true
   });
}

function criarDialogoErro() {
   var div = '<div title="Erro" "><p>Falha na verificação!</p></div>';
   return $(div).dialog({
      modal : true
   });
}

function criarDialogoSucesso() {
   var div = '<div title="Sucesso" "><p>Sucesso!</p></div>';
   return $(div).dialog({
      modal : true
   });
}

Esse código mantém o usuário informado do estado de execução. À cada 1 segundo, uma chamada é feita e um contador é decrementado de 10 à 0. O valor atual desse contador é exibido em uma caixa de diálogo para o usuário.

Anúncios
  1. Nenhum comentário ainda.
  1. No trackbacks yet.

Deixe um comentário

Preencha os seus dados abaixo ou clique em um ícone para log in:

Logotipo do WordPress.com

Você está comentando utilizando sua conta WordPress.com. Sair / Alterar )

Imagem do Twitter

Você está comentando utilizando sua conta Twitter. Sair / Alterar )

Foto do Facebook

Você está comentando utilizando sua conta Facebook. Sair / Alterar )

Foto do Google+

Você está comentando utilizando sua conta Google+. Sair / Alterar )

Conectando a %s

%d blogueiros gostam disto: