Ajax e filas de requisição
por Walter Cruz on 16/09/2005
in JavaScript
Recentemente, num projeto aqui do trabalho, tivemos de criar um formulário com 4 combos dinâmicos de estado/cidade na mesma página. Resolvi popular a combo de cidades usando XMLHttpRequest, e para evitar repetição de código, fiz com que os quatro combos fossem populados usando a mesma função.
Porém, não dava certo, e me retornava um erro bem estranho no Firefox. Percebi então que criando um objeto XMLHttpRequest para cada lugar em que ele seria usado funcionava corretamente, porém, ao custo de ter não apenas um, mas quatro objetos XMLHttpRequest na página.
Embora o código estivesse funcionando a contento com essa modificação, eu ainda fiquei com a pulga atrás da orelha: porque não funcionava?
Procurando aqui e ali, achei alguns links interessantes que me esclareceram muito:
- http://www.quirksmode.org/blog/archives/2005/09/xmlhttp_notes_a_1.html
- http://ajaxblog.com/archives/2005/06/01/async-requests-over-an-unreliable-network
O erro mostrado no firefox é esse:
Erro: uncaught exception: [Exception... "Component returned failure code: 0xc1f30001 (NS_ERROR_NOT_INITIALIZED) [nsIXMLHttpRequest.send]" nsresult: "0xc1f30001 (NS_ERROR_NOT_INITIALIZED)" location: "JS frame :: http://www.waltercruz.com/devel/ajaxteste/externalvar.html :: popula :: line 51" data: no]
A questão era relativamente mais simples do que o erro que o Firefox mostra: Ao enviar uma requisição send para um objeto XMLHttpRequest que já está processando uma requisição era lançado o erro. A solução mais simples é implementar uma fila de requisições.
Por sorte, o Élcio do tableless lançou o segundo artigo de uma série que trata justamente disso. (Os links são: http://www.tableless.com.br/ajaxdemo/ e http://www.tableless.com.br/ajaxdemo2/ ).
Para simplificar, fiz um teste populando dois selects a partir de um arquivo de texto. Os testes estão em http://waltercruz.com/devel/ajaxteste/.
Mais links interessantes sobre Ajax e javascript:
Subscribe: 



Seguinte cara, eu consegui fazer sem esses negócio de fila. É só criar vários objetos XMLHttpRequest e não ficar dependendo de apenas UM objeto.
No meu blog eu mostro uma função simples, mas totalmente funcional, pra ajax que faz todo o trabalho complicado pra você: http://elmicox.blogspot.com/2006/05/ajax-funo-rpida-e-simples.html