Frage

Alle 3 Sekunden Ich mache einen AJAX-POST-Anfrage den Status eines Prozesses zu erhalten. Dies funktioniert gut.

Wenn der Prozess 100% erreicht eine Rückruffunktion ausführt (unten angegeben) neue Elemente zu der Seite hinzufügen und dann bricht es die setTimeout Methode, die den Fortschritt kontinuierlich erhält alle 3 Sekunden verwenden. Allerdings habe ich von meinem Benutzer gesagt, dass es manchmal nicht abzubrechen und die neuen Elemente werden nicht auf der Seite hinzugefügt und ich bin, dass es zu zeigen, „100%“ stecken.

Ich habe diese wieder getestet und wieder und es wird für mich nie stecken. Der Code sieht auch ok, aber meine JavaScript Fähigkeiten sind nicht groß und so war ich die Hoffnung, jemand könnte darauf hinweisen, wenn es Potenzial dieses Problems ist passiert?

Ich habe den Code kommentiert, entschuldige seine sehr lang. Ich habe versucht, es zu reduzieren.

function convertNow(validURL){

    startTime = setTimeout('getStatus();', 6000); 
       //AJAX CALL TO RUN PROCESS
       $.ajax({
       type: "GET",
       url: "main.php",
       data: 'url=' + validURL + '&filename=' + fileNameTxt,
       success: function(msg){
       //ON SUCCESS CLEAR SETTIMEOUT AND SHOW ELEMENTS (text)
       clearTimeout(continueTime);
       clearTimeout(startTime);    
        $("#loading").hide("slow");
        $("#done").html("Done");   
       }//function

     });//ajax

}//function convertNow

function getStatus(){
        //AJAX CALL TO GET STATUS OF PROCESS
        $.ajax({
        type: "POST",
        url: "fileReader.php",
        data: 'textFile=' + fileNameTxt,
        success: function(respomse){
        textFileResponse = respomse.split(" ");
        $("#done").html("Processing...");
        }
        });//ajax
        clearTimeout(continueTime);

        if(textFileResponse[0]=='100.0%'){
            clearTimeout(continueTime);
        }
        else{
            clearTimeout(startTime);
            continueTime = setTimeout('getStatus();', 3000); 
        }
}
War es hilfreich?

Lösung

Es ist wahrscheinlich ein Analysefehler in der textFileReponse [0] == ‚100,0%‘ in einigen Rand Fällen mit dem Wert in der Antwort gleich nicht genau 100,0% (vielleicht gibt es zusätzliche Leerzeichen, oder vielleicht gibt es einige kleinere Unterschiede auf einige Plattformen, etc ...). Dies würde der Code führt bis zum else {} Block zu fallen, und Ihre getStatus Funktion wieder Warteschlange gestellt wird.

EDIT: der Faden in den Kommentaren gegeben, es ist auch eine gleiche Wahrscheinlichkeit, dass es eine Race-Bedingung ist zwischen den beiden Blöcken von Ajax-Code geht. (Gerade dabei dies hier zum Nutzen der Leser). END EDIT

Was möchten Sie wahrscheinlich, zusätzlich die Analyse zur Lösung ist jedoch setInterval () zu verwenden, mit nur einem Timer, anstelle einer Startzeit und continueTime Timer. SetTimeout führt nur einmal, während setInterval alle x Millisekunden wiederholt, so dass Sie würde nur einen braucht. Um eine setInterval abzubrechen, verwenden clearInterval.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top