• Jetzt anmelden. Es dauert nur 2 Minuten und ist kostenlos!

Ajax Abfrage und For-Schleife abwarten

yss

Mitglied
Hey Leute
Ich habe ein JavaScript, welches mir per PHP eine Google Suchanfrage holt und in ein Div postet.
Danach such ich mir die ersten 5 Links der Suchabfrage raus, Speicher sie in ein Array und will diese Links dann nacheinander abarbeiten.
Eine Funktion ruft dann den Link wieder per Ajax auf und postet den Inhalt in ein Div. Dann wird der Content durchsucht (dabei werden manchmal schon so 2000-5000 Wörter überprüft). Das Problem ist nun, dass das Überprüfen des Content zu lange dauert. In Firebug kann ich sehen, wie Ajax anfängt die erste Seite zu laden, doch dann werden die restlichen 5 Seiten auch noch geladen und der Browser hängt sich auf. Wenn ich ihm sage, dass er nur eine Seite überprüfen soll, macht er das ohne Probleme. Wie kann ich also auf die die Funktion warten, welche mit den Content holt und durchsucht, so dass die Prozedur immer nur einmal durchläuft, bevor sie mit der neuen Seite wieder durchläuft?

Hier noch der Code, damit ihr einen groben Überblick habt, wie ich das meine:

Code:
var b = 0;function sendLinks(){
    var laenge = 0;
    switch(links.length){
        case 0: laenge=0;break;
        case 1: laenge=1;break;
        case 2: laenge=2;break;
        case 3: laenge=3;break;
        case 4: laenge=4;break;
        case 5: laenge=5;break;
    }
    if(links.length > 5){
        laenge = 5;
    }
    for(j = 0; j<laenge; j++){
        //Array für Suchwörter
        worter = new Array();
        //b reseten
        b = 0;
        //Content des Links holen
        $.ajax({
            type: "POST",
            url: "getLinksContent.php",
            data:     "url="+links[j],
            success: function(html){
                //Inhalt in Bufferframe einfügen
                document.getElementById('secondFrame').innerHTML = html;
                //Alle Links dieser Seite durchsuchen
                while(typeof document.getElementById('secondFrame').getElementsByTagName('a')[b]=='object'){
                    ubereinstimmung = 0;
                    //Suchtags in einzelne Wörter zerteilen
                    worter = document.getElementById('tags').value.toLowerCase().split(" ");
                    linkinhalt = document.getElementById('secondFrame').getElementsByTagName('a')[b].innerHTML.toLowerCase();
                    //Jedes Wort einzeln prüfen
                    for(i = 0; i<worter.length; i++){
                        //Logausgabe
                        document.getElementById('test').innerHTML = document.getElementById('test').innerHTML+'<br />'+(document.getElementById('secondFrame').getElementsByTagName('a')[b].innerHTML+" mit "+worter[i]);
                        //Wenn das Wort in der Beschreibung des Links vorhanden ist
                        if(linkinhalt.indexOf(worter[i]) > -1){
                            ubereinstimmung++;
                        }
                    }
                    if(ubereinstimmung >= Math.round((worter.length)/2)){
                        finalLinks.push(document.getElementById('secondFrame').getElementsByTagName('a')[b].href);
                        finalNames.push(document.getElementById('secondFrame').getElementsByTagName('a')[b].innerHTML);
                        alert(finalNames);
                    }
                    b++;
                }
            }
        });
    }
    
}
 
Werbung:
Du willst also nach jedem Ajax Request ein neues Request senden?
Dann mach dir eine queue, die jedes mal aufgerufen wird sobald ein request zu ende ist.
Mach dir ein Array

var queue = [];

dann jedes mal wenn du neue Seiten anfragen willst machst du folgendes

queue.push("seitexy.de");

Dann fängst du mit den request an. Dafür brauchst du einen Zähler, damit du deine request hochzählen kannst.

dann könnte dein request so aussehen:

Code:
function doRequest() {
$.ajax({
  "url" : queue[counter],
  "success" : function(response) {
      counter++;
      doStuffWithResponse(response);
      doRequest();
  }
});

Dann machst du immer nur ein Request auf einmal :)
 
Zurück
Oben