Executando Ajax via JQuery de modo enfileirado
[ad#texto]
JQuery adicionou uma nova visão sobre o desenvolvimento de interfaces ricas para sites e sistemas Web, afinal, não era mais preciso programar dezenas de linhas em Ajax, poderíamos consumir Ajax de forma simples utilizando as funções da JQuery.
Como todos sabem, por excelência as chamadas de Ajax no JQuery são assíncronas, e quando você está dentro de um laço de repetição e aciona uma URL que irá processar algo para o seu sistema em backend, porém esta execução é lenta e ir chamando via Ajax tem a particularidade de ir executando o laço de repetição até a sua finalização e mesmo que a execução do Ajax não tiver sido finalizada uma nova requisição é feita.
A principio isto não é ruim, porém, em determinados casos é possível que uma execução interfera sobre a outra devido ao fato de que podem manipular a mesma rotina interna, como acertar isto então?
Embora desde a versão 1.5 o JQuery implemente .deferred nas chamadas Ajax é possível que a alteração da sua rotina para um controle de .deferred se torne muito árduo, por isso existem soluções mais simples e que podem servir a um grande leque de situações, a solução mais simples para o processo acima é deixar a execução do Ajax via JQuery de forma síncrona, assim, uma repetição do laço só ocorre quando a requisição Ajax terminar, criando assim um fila única do processo.
Veja um exemplo:
jQuery.ajax({
url: “/meuScript.php”, //Aqui vai a URL ou script a ser acionado
async: false, //Aqui você define a execução como síncrona
jsonp: false, //Controle do fluxo de retorno
complete: function( /*coloque aqui sua instrução ao finalizar com sucesso a sua requisição*/){ }
});
Viu, muito simples, como tudo em JQuery, embora extremamente simples de se implementada a técnica acima tem um grave problema, por ser uma execução síncrona, o browser ficará congelado, o que não é nada elegante, aguardando o retorno da execução e caso outros scripts precisem se acionados eles terão que esperar a execução da chamada síncrona, não haverá modo de executa-los paralelamente.
Como resolver então?
É simples também, não deixem de acompanhar a solução assíncrona para o problema proposto.