2008-09-16 6 views
5

Mit diesem Code kann ich ein animiertes GIF anzeigen, während der Server-Skript ausgeführt wird:Wie wird der Fortschritt eines Server-Skripts in jQuery angezeigt?

function calculateTotals() { 
    $('#results').load('getResults.php', null, showStatusFinished); 
    showLoadStatus(); 
} 

function showLoadStatus() { 
    $('#status').html(''); 
} 


function showStatusFinished() { 
    $('#status').html('Finished.'); 
} 

Aber ich möchte einen Status wie weit angezeigt werden entlang der Schrift ist, z.B. "Bearbeitungslinie 342 von 20000 ..." und es bis zum Ende hochzählen lassen.

Wie kann ich das tun? Ich kann ein Server-Skript erstellen, das ständig die aktualisierten Informationen enthält, aber wo setze ich den Befehl, um das zu lesen, sagen wir, jede Sekunde?

Antwort

2

Nach dem Lesen Ihrer Kommentare zu Andrew's Antwort.

Sie würden den Status wie folgt lesen:

function getStatus() { 
    $.getJSON("/status.php",{"session":0, "requestID":12345}, 
    function(data) { //data is the returned JSON object from the server {name:"value"} 
      setStatus(data.status); 
      window.setTimeout("getStatus()",intervalInMS) 
    }); 
} 

Mit dieser Methode können Sie gleichzeitig mehrere XHR-Anforderung auf dem Server öffnen können.

all status.php zur Ausgabe ist:

{"status":"We are done row 1040/45983459"} 

Sie können jedoch ausgegeben, so viele Informationen, die Sie in der Antwort wollen und entsprechend zu verarbeiten (einen Fortschrittsbalken zum Beispiel Fütterung oder eine Animation durchführen. .)

weitere Informationen zu $ ​​.getJSON sehen http://docs.jquery.com/Ajax/jQuery.getJSON

0

Ihr serverseitiges Skript sollte irgendwie seinen Fortschritt irgendwo auf dem Server (Datei, Feld in der Datenbank, memcached usw.) behalten.

Sie sollten die AJAX-Funktion haben, die den aktuellen Fortschritt anzeigt. Picken Sie diese Funktion einmal pro Sekunde und rendern Sie das Ergebnis entsprechend.

0

Ohne zu wissen, wie Ihr serverseitiger Code funktioniert, ist es schwer zu sagen. Es gibt jedoch drei Stufen für den Prozess. Zuerst müssen Sie ein Job-Erstellungsskript aufrufen. Dies gibt eine ID-Nummer zurück und setzt den Server in Betrieb. Als nächstes müssen Sie jede Sekunde ein Statusskript aufrufen, das eine Statusmeldung zurückgibt, die Sie anzeigen möchten. Dieses Statusskript muss auch einen Wert zurückgeben, der angibt, ob der Job beendet wurde oder nicht. Wenn das Statusskript angibt, dass der Job beendet ist, hören Sie auf zu polling.

Wie Sie dieses Statusskript bekommen, ist zu wissen, dass der Status des Jobs stark davon abhängt, wie der Server eingerichtet wird, aber wahrscheinlich die Nachricht in eine Datenbanktabelle an verschiedenen Stellen während des Jobs schreibt. Das Statusskript liest diese Nachricht dann aus der Datenbank.

+0

Richtig, aber wo habe ich die Linie, die den Status Skript liest? Das verstehe ich nicht. Ich kann es nicht in meiner Funktion showLoadStatus() tun, da es nur einmal ausgeführt wird. –

1

Ich bin nicht mit den Besonderheiten für jQuery, aber eine allgemeine Antwort, die keine Polling wold sein wird: Verwenden Sie eine Variation der forever frame Technik. Erstellen Sie im Grunde einen versteckten Iframe und stellen Sie den src davon auf 'getresults.php' ein. Innerhalb von getresults "streamen" Sie zurück Skriptblöcke, die Aufrufe einer javascrpt-Funktion im übergeordneten Dokument sind, die den Fortschritt tatsächlich aktualisiert. Hier ist an example, die die Grundidee hinter einem Frame für immer zeigt. (Ich würde nicht empfehlen, seine tatsächliche JS oder HTML verwenden, aber es ist ziemlich durchschnittlich)

Verwandte Themen