dedlfix: Fortschrittsbalken - Länger dauerndes Script

Beitrag lesen

Tach!

ich habe Seite A klicke auf den Formular Button und die Funktion auf Seite B wird aufgerufen. Man wartet einige Zeit bis diese Funktion beendet ist, solange bleibt man (ungewollt) auf Seite A und sieht oben im Tab, dass die Seite arbeitet.

In der Zeit wartet der Browser auf das Ende der Response und zeigt seinen eigenen mehr oder weniger nichtssagenden Balken an. Der Request erfolgt synchron, sagt man dazu. Möchtest du selbst die Kontrolle behalten, dann kannst du einen asynchronen Request starten und machst im Vordergrund solange etwas, bis das Ergebnis eingetrudelt ist (Ajax). Das Problem ist nur, wie man den echten Fortschritt anzeigen lassen kann, statt eines lediglich animierten Irgendwas ...

Ich möchte eine Fortschrittsanzeige anzeigen und habe dieses Script dafür
https://github.com/TheBrockEllis/jQuery-and-PHP-Progress-Bar

Das wollte bei mir schon nicht wie gedacht. Es soll eigentlich ständig was zum Browser senden, damit dieser dann was tut, aber es wartete bis der Request (d.h. die künstliche Verzögerung) beendet war. Vermutlich war der Server schuld, der den flush()-Wunsch nicht erfüllte.

Das Script muss ich aber in Seite B einbauen. Wie eben erwähnt bleibt man aber auf Seite A und erst, wenn die Funktion fertig durchgelaufen ist sieht man Seite B.

Ja, man wartet schließlich darauf, dass B fertig wird, bevor da was gerendert werden kann - beziehungsweise bis so viel da ist, dass was gerendert werden kann. Dass der Browser bis eben noch A angezeigt hat, ist uninteressant. Der Server bearbeitet B und der Browser wartet nur darauf. Mit der Methode dieses Scripts kann er auch nur dann etwas anzeigen, wenn B seine Fortschrittshäppchen sendet. Schau mal in die Quelltext-Ansicht des Browsers, was B da produziert.

Wie kann ich denn jetzt den Fortschritt anzeigen?

Das Script ist eine Variante, die jedoch nicht unter allen Umständen arbeitet. Nicht nur Webserver, auch Browser können da ungewollt innehalten, statt Fortschritt anzuzeigen.

Eine andere Möglichkeit ist, einen asynchronen Request abzusetzen und auf dessen Beendigung zu warten. Währenddessen kann man periodisch Requests an den Server absetzen, um sich über den Fortschritt zu informieren. Diese Requests müssen an ein anderes Script gehen, das in irgendeiner gemeinsamen Datenhaltung nachschaut, was das eigentliche Script da an Fortschritt eingetragen hat. Letzteres muss dorthinein natürlich regelmäßig berichten - am besten eindeutig einer Task zugeordnet, denn im Web kann ja vieles parallel laufen.

dedlfix.