Fila de requisições Ajax, Prototype
Há muito tinha lido o artigo do Elcio no tableless.com.br sobre fila de requissões ajax. Mas ao ler o código, vi que funcionava como uma Fila mas não estava implementado como tal. Achei super interessante a idéia e fiquei com vontade de implementar.
Mas, como eu trabalho por necessidade e não por vontade, meses depois eu me vi na situação em que precisei.
Está completamente funcional. Implementei em cima do framework prototype.
Ainda não satisfeito com ela. Falta dar a funcionalidade de associar a função externa a biblioteca ao evento de falha do Ajax
Para utilizar, basta chamar a função ‘ajax’ passando 1º a URL, por 2º, pode-se optar pelo id do objeto HTML que irá receber o retorno completo do Ajax, passado com String, ou pode-se passar uma função que irá tratar o retorno. Em 3º, opcional, é a string de parâmetros.
Ex 1: ajax(’ajax.asp’, ‘divContent’);
Ex 2: ajax(’ajax.php’, fTrataRetornoAjax);
Ex 3: ajax(’ajax.jsp’, fTrataRetornoAjax, ‘acao=consultar&codigo=33′);
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 | <!-- // Criado por JALEX em novembro/2007 baseaso no exemplo do "Elcio Ferreira * Tableless.com.br" // VERSAO: 1.0 // contato: jalex1979@yahoo.com.br / jalex79@gmail.com var arrAjaxFila=[]; //Fila de requisições AJAX var strFila_carregando='<span class="lblCarregando">Carregando...</span>'; function ajax() //Carrega via AJAX a url recebida e coloca seu valor no objeto com o id recebido { if(arguments.length<2) return false; switch(typeof arguments[1]) { case 'string': $(arguments[1]).innerHTML=strFila_carregando; arrAjaxFila.push([1,arguments[0],arguments[1],arguments[2]]); break; case 'function': arrAjaxFila.push([0,arguments[0],arguments[1],arguments[2],arguments[3]]); if(typeof arrAjaxFila[0][4]=='string')$(arrAjaxFila[0][4]).innerHTML=strFila_carregando; break; default:alert('ERROR: mal uso da função'); } if(arrAjaxFila.length==1) _ajaxRun(); //Se não há conexões pendentes, executa o próximo da fila } function _ajaxRun() { if(arrAjaxFila[0][0]) new Ajax.Updater( arrAjaxFila[0][2], arrAjaxFila[0][1], { parameters:arrAjaxFila[0][3], onComplete:pFila_requisicaoTerminada, onFailure:pAjax_insucesso } ); else new Ajax.Request( arrAjaxFila[0][1], { parameters:arrAjaxFila[0][3], onComplete:pFila_requisicaoTerminada, onSuccess:arrAjaxFila[0][2], onFailure:pAjax_insucesso } ); } function pFila_requisicaoTerminada() { if(typeof arrAjaxFila[0][4]=='string')$(arrAjaxFila[0][4]).innerHTML=''; arrAjaxFila.shift(); if(arrAjaxFila.length>0)setTimeout('_ajaxRun()',5); } function pAjax_insucesso(){alert('Não possível resgatar informações.');} --> |
Entry Details
Publicado em 20/12/2007 às 10:12 em Ajax, Javascript, prototype.js

Indicado por mim
Valeu pela dica do site.
Uma sugestão para melhoria: Ao invés de usar o setTimeout, pode-se também fazer a fila andar quando o ajax retornar com sucesso, diminuindo a carga no servidor.
Caso o servidor demore mais tempo para responder do que o indicado, pode-se congestionar ainda mais o servidor (daí a idéia de esperar pela conclusão da requisição iniciada anteriormente).
Uma vez que a requisição terminou por completo (readyState = 4 e status = 200), inicia-se nova requisição com o próximo elemento da fila.
Para processos que consomem muitos recursos (por exemplo, geração de pdf’s, txt’s etc), esta alternativa pode ser mais interessante.
Como todos sabem, geralmente o usuário faz o que é mais prático pra ele (e nem sempre pensa nos outros). Assim, é mais fácil o usuário mandar exportar N arquivos, sendo que na verdade ele precisa de 2 ou 3 apenas.
Fica aí a dica.
Bom, eu fui muito sucinto no post. Mas foi porque também, pra entender este, era bom ler antes o artigo do Elcio Ferreira no Tableless.com.br
Agradeço demais a dica, e o código está ai é pra isso mesmo, pra copiar e pra evoluir.
Mas li e reli o seu comentário Luis e acho que ele já faz o que vc diz.
1. “Ao invés de usar o setTimeout, pode-se também fazer a fila andar quando o ajax retornar com sucesso”
R: Ele só chama a próxima requisição quando a última tiver chegado.
2. “Caso o servidor demore mais tempo para responder do que o indicado, pode-se congestionar ainda mais o servidor”
R: Não entendi por que ia congestionar. A fila é justamente pra evitar isso.
E o settimeout é só uma segurança subjetiva. Já tinha no código do Elcio. Por mim eu chamaria direto o método que chama a próxima requisição, mas eu quis manter assim. Se tirar, fica 5 milisegundos mais rápido =)
s/requissões/requisições/ # chato de plantão