Women in Technology

Hear us Roar



Article:
  A Simpler Ajax Path
Subject:   multiple xmlHttp requests
Date:   2006-02-18 10:32:45
From:   Echo2501
I have a way to get around the single http_request resource and multiple requests to it. It still uses it as a global variable, but as an array. In a nutshell, it goes through the array and finds an available resource. If there isn't one, it creates a new one.



<script type="text/javascript" language="javascript">


var xhr = new Array(); // ARRAY OF XML-HTTP REQUESTS
var xi = new Array(0); // ARRAY OF XML-HTTP REQUEST INDEXES
xi[0] = 1; // FIRST INDEX SET TO 1 MAKING IT AVAILABLE


function xhrRequest(type) {
if (!type) {
type = 'html';
}


// xhrsend IS THE xi POSITION THAT GETS PASSED BACK
// INITIALIZED TO THE LENGTH OF THE ARRAY(LAST POSITION + 1)
// IN CASE A FREE RESOURCE ISN'T FOUND IN THE LOOP
var xhrsend = xi.length;

// GO THROUGH AVAILABLE xi VALUES
for (var i=0; i<xi.length; i++) {


// IF IT'S 1 (AVAILABLE), ALLOCATE IT FOR USE AND BREAK
if (xi[i] == 1) {
xi[i] = 0;
xhrsend = i;
break;
}
}


// SET TO 0 SINCE IT'S NOW ALLOCATED FOR USE
xi[xhrsend] = 0;


// SET UP THE REQUEST
if (window.ActiveXObject) {
try {
xhr[xhrsend] = new ActiveXObject("Msxml2.XMLHTTP");
} catch (e) {
try {
xhr[xhrsend] = new ActiveXObject("Microsoft.XMLHTTP");
} catch (e) {}
}
} else if (window.XMLHttpRequest) {
xhr[xhrsend] = new XMLHttpRequest();
if (xhr[xhrsend].overrideMimeType) {
xhr[xhrsend].overrideMimeType('text/' + type);
}
}
return (xhrsend);
}


function fcn(url, reqType) {


var xhri = xhrRequest('html');
xhr[xhri].open('GET', url, true);
xhr[xhri].onreadystatechange = function() {
if (xhr[xhri].readyState == 4 && xhr[xhri].status == 200) {
alert(xhr[xhri].responseText);
xi[xhri] = 1;
xhr[xhri] = null;
}
};
xhr[xhri].send(null);
}


function loadMulti() {
// CALL A FUNCTION THAT USES xmlHttp MULTIPLE TIMES
fcn('file1.html');
fcn('file2.html');
fcn('file3.html');
}


window.onload = loadMulti();



</script>
</pre>


I'm rewriting some of this from the functions I've been testing, so something might break, but the general idea's there.


Here's a sample of it in use: http://www.digitalbonsai.com/xhrmulti.php


- Luis (lu@digitalbonsai.com)