Ik heb een for loop waarin ik ajax requests laat doen door jQuery.
Dit is het betreffende stukje code:


ImageLoader = function() {
	
	var amtLoad = 0;
	var loadList = [];
	var loadedImages = [];
	var callback;
	
	this.loadAll = function() {
		
		var t = this;
		
		for(var i = 0; i < loadList.length; i++) {
			
			$.get(loadList, function() {
				
				t.loaded();
			});
			
		}
		console.log("Test");
	};
	
	this.loaded = function() {
		
		console.log("Loaded");
		amtLoad--;
		
		if(amtLoad <= 0) {
			
			callback();
		}
	};
};

Ik doe het volgende. Ik heb een object dat afbeeldingen kan pre-loaden. Ik voeg urls toe aan dat object, en roep dan de functie loadAll() aan. Die laadt alle urls die in de loadList waren gezet.
Het werkt allemaal, maar ik ben er achter gekomen dat de requests achter elkaar worden uitgevoerd, in de volgorde van de loop. Daardoor gaat het laden langzamer. De requests zijn niet tegelijkertijd. Terwijl de javascript juist wel asynchroon ernaast verder gaat. Dus javascript blokt niet (nooit bij ajax requests) maar de requests worden niet tegelijkertijd behandeld. Ik weet wel dat dit gewoon moet kunnen. Hoe doe ik dit? Is het een jquery parameter die ik moet toevoegen?

Om het voorbeeld nog duidelijker te maken:
Stel ik zet in de loadlist 10x een url naar "wait.php". Dat php script doet een sleep() van 2 seconden. Dan duurt het laden 20 seconden, terwijl het de bedoeling is dat al die 10 requests direct achter elkaar worden verzonden en tegelijkertijd dus "laden" en dat het dus eigenlijk rond de 2 seconden zou moeten duren.

Toevoeging
Als ik setTimeout() gebruik bij elke lus in de loop, dan gaan de requests wel tegelijk. Dit is dus een oplossing, maar is er geen betere?
Je moet eens goed testen of er überhaupt wel 10 parallelle connecties kunnen worden gebruikt:

• De meeste clients gebruiken 2 of 6 parallelle connecties, geen 10.

• Je webserver moet 10 parallelle connecties voor 1 client toestaan, wat meestal te veel van het goede is.

• Gebruik een keep-alive, zodat een eenmaal geopende connectie wordt hergebruikt.

Ik zou dat op de lompe manier doen in HTML met een div'je van 1 bij 1 pixel waar je alle afbeeldingen in laadt. Daarna kijken hoe de waterval van je netwerkverkeer eruit ziet:


<div style="width: 1px; height: 1px; overflow: hidden;">
  <img src="plaatje01.png">
  <img src="plaatje02.png">
  ...
  <img src="plaatje09.png">
  <img src="plaatje10.png">
</div>
Ik denk dat je sessie wordt gestart in dat php script wat je aanroept. Indien je dit niet doet (dus geen sessie start) zou je waarschijnlijk parallel kunnen aanroepen

Reageren