zeitlich begrenztes confirm


Sprint

Erfahrenes Mitglied
#1
Hallo zusammen,

ich habe hier eine paar PHP Scripte, die von einer Ajax Routine nacheinander und in einer Schleife aufgerufen werden. Während der Zeit, in der JS auf die Rückgabe vom Server wartet, reagiert die umgebende HTML Seite auf keine Eingabe. Ich kann die Schleife somit nicht unterbrechen, außer es kommt zu einem (abgefangenen) Timeout Error. Da ich später im Einsatz ca 600 Schleifendurchläufe erwarte, wäre es schön, wenn ich das zwischendurch mal anhalten könnte, um ein paar Einstellungen zu ändern oder mal die Logs anzusehen.
Das einfachste wäre für mich, ein confirm() einzubauen, das so alle paar 10 Durchläufe auftaucht und nachfragt, ob es weitermachen soll. Um jetzt aber nicht ständig das confirm bestätigen zu müssen, wäre es gut, wenn das Script automatisch nach 10 Sekunden das confirm selbständig beendet, wenn es nicht vom User betätigt wird.

Hat jemand eine Idee, wie das hinzukriegen wäre?
 

Sprint

Erfahrenes Mitglied
#3
Wenn ich davon ausgehe, daß jQuery einen synchronen Aufruf nur durchführt, wenn "async: false" mit übergeben wird, dann sollte hier nichts synchron laufen.

Aber selbst dann sollte eine Unterbrechung nur am jeweiligen Ende eines Schleifendurchlaufs möglich sein. Insgesamt sind es drei PHP Scripte, die nacheinander aufgerufen werden und nur nach dem letzten sind alle Dateien bzw. Datenbankeinträge korrekt abgeschlossen.
 

Sempervivum

Erfahrenes Mitglied
#4
Das stimmt natürlich, bei jQuery ist asynchron Default. Dann verstehe ich es nicht.

Wo läuft denn überhaupt die Schleife, clientseitig mit Javascript oder serverseitig?
Insgesamt sind es drei PHP Scripte, die nacheinander aufgerufen werden und nur nach dem letzten sind alle Dateien bzw. Datenbankeinträge korrekt abgeschlossen.
Dann würde ich daran denken, diese Abhängigkeit serverseitig zu berücksichtigen und die Skripe dort nacheinander aufzurufen.
 

Sprint

Erfahrenes Mitglied
#5
Die Schleife läuft auf dem Client.

Die Scripte vom Server aufrufen zu lassen, hatte ich am Anfang auch. Ich hab das aber absichtlich vom Client aus machen lassen, um Fortschritte zwischendrin anzeigen zu lassen.
 

Sempervivum

Erfahrenes Mitglied
#6
OK, das ist plausibel. Bleibt zunächst die Frage, wie es zu dieser Blockade kommt, obwohl die Requests asynchron abgesetzt werden. Hast Du es online, so dass man es sich in Aktion ansehen kann?
 

ComFreek

Mod | @comfreek
Moderator
#8
Aber selbst dann sollte eine Unterbrechung nur am jeweiligen Ende eines Schleifendurchlaufs möglich sein.
Dann musst du nach jedem X. Schleifendurchlauf die JS-Funktion "abbrechen" lassen, d.h. den Kontrollfluss an den Browser zurückgeben und nur in einem Eventhandler z. B. auf einem "Continue"-Button den (X+1). bis (2X). Schleifendurchlauf starten. Danach dasselbe Spiel.
In Code könnte das so aussehen:
Javascript:
let lastIteration = 0;
const iterationsPerBatch = X; // e.g. 50
function doBatch() {
  // use Math.max(lastIteration, maxIteration) or similar to prevent
  // overflow
  for (let i = lastIteration; i < lastIteration + iterationsPerBatch; i++) {
    // ...
  }
  lastIteration += iterationsPerBatch;
}
myButton.addEventListener('click', doBatch);
 

Neue Beiträge