Mehr Speed durch parallele AJAX-Requests
Hallo Forum,
mal noch etwas zu diesem Thema:
blog.seitenreport.de/artikel/2011/04/05/howto-mehr-speed-durch-parallele-ajax-requests/
Hier ist noch eine kleine Lösung für dieses Thema verpackt in einem Objekt.
Der Vorteil dieser Variante ist das man selber bestimmen kann wie viele Anfragen gleichzeitig gesendet werden sollen (der FF macht maximal 6 je Domain) und es wird zwischen Post und Get Unterschieden. Wenn zu viele Anfragen auf einmal kommen, werden diese in eine Warteschlange gestellt.
Hier mal das Objekt:
[JS]<script>
var request={
channels:[],
channelsize:5,
querys:[],
init:function(){
for(var i=0;i<this.channelsize;i++)this.channels[i]=null; <br /> },
/**
* send a XMLHttpRequest
*
* @param uri The uri of the ressource.
* @param post Post datafield.
* @param cb Callbackfunction for the response.
*/
send:function(uri,post,cb){
this.querys.push({'uri':uri,'post':post,'cb':cb});
this._run();
},
_run:function(){
if(this.querys.length==0)return;
for(var i=0;i<this.channelsize;i++){ <br /> if (this.channels[i]===null) {
var job=this.querys.pop();
this.channels[i] = new XMLHttpRequest();
this.channels[i].callback=job.cb;
this.channels[i].id=i;
this.channels[i].open((job.post)?'POST':'GET', job.uri, true);
if(job.post)this.channels[i].setRequestHeader('Content-type','application/x-www-form-urlencoded;Charset=utf-8');
this.channels[i].onreadystatechange=function(){
if(this.readyState==4){
if (this.status==200)eval(this.callback+'(this.responseText)');
request._clearChannel(this.id);
}
}
this.channels[i].send(job.post);
break;
}
}
},
_clearChannel:function(id){this.channels[id]=null;this._run()}
}
request.init();
</script>[/JS]
Und so werden die Anfragen gesendet:
[JS]<script>
// mit Post Daten
request.send('example.php','foo=bar&bar=foo','callback');
// mit Get Daten
request.send('example.php?foo=bar&bar=foo',null,'callback');
// oder beides
request.send('example.php?get=foo', 'post=bar','callback');
</script>[/JS]
Und so könnte die Callback Funktion aussehen:
[JS]<script>
function callback(responseText) {
// Reponse verarbeiten
}
</script>[/JS]
So mich würde eure Meinung dazu interessieren und was ich noch verbessern könnte. (Die Unterstützung von älteren Browsern habe ich absichtlich ignoriert.)
Schöne Grüße
Thomas
Beitrag erstellen
EinloggenKostenlos registrieren