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='&lt;span class="lblCarregando"&gt;Carregando...&lt;/span&gt;';
function ajax()    //Carrega via AJAX a url recebida e coloca seu valor no objeto com o id recebido
{  if(arguments.length&lt;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&gt;0)setTimeout('_ajaxRun()',5);
}
function pAjax_insucesso(){alert('Não possível resgatar informações.');}
-->