[FRAGE] Warum blockt Browser bei 2 simultanen Ajax Calls?

Poolshark

New member
Hallo,

ich bin neu hier und entschuldige mich schon mal falls dies eine blöde Frage ist, aber ich versuche schon seit Stunden dies zu lösen.

Ich habe 2 Funktionen mit Ajax Calls (im Moment nur Test Actions - später sollen sie dann von einander abhängen). Funktion 1 hat einen Callback auf sich selbst mit 2ms, Funktion 2 braucht 10s bis sie fertig ist.

  • beider Funktionen funktionieren selbststäbdig
  • Sobald Funktion 2 gestartet is wird der Aufruf von 1 solange geblockt bis 2 fertig ist.

Ist das nicht gegen die "asynchron Theorie" von Ajax? Sollte es nicht möglich sein, dass beide Funktionen zur selben Zeit ablaufen?

Hier mein jQuery:

HTML:
<script type="text/javascript">
$('#tbut').click(function(){

        // Declare variables
        var go1 = true;
        var go2 = true;
        var z = 1;

        // Fire 1st Ajax call
        a();

        // 1st function with callback
        function a() {
            $.ajax({
                url: 't2'
            })
             .always(function() {
                console.log('t2 always');
                $('#tdiv').html(z);         // update DIV 
                z = z + 1;
                if (go1) {
                    if (go2) {
                        b();
                    }
                    setTimeout(function(){a()},2); // callback
                }
            });
        };

        // 2nd function
        function b() {
            go2 = false;
            $.ajax ({
                url: 't1'
            })
             .done(function() {
                console.log('fin');
                $('#tdiv').html('fin'); // update DIV
                go1 = false;
            });

        };

       return false;

    });
</script>


<button id="tbut">do something...</button>
<div id="tdiv">now</div>

Und hier meine controller actions:

PHP:
public function actionT1() {
   // make it take a little longer...
   $i=0;
   while ($i < 10) {
      $i++;
      sleep(1);
   }
   exit;
}

public function actionT2() {
   // do nothing here at the moment...
    exit;
}
 
Zuletzt bearbeitet:
Wenn ich nichts übersehen habe sind go1 und go2 nur beim Start true. Sobald b einmal vollendet ist sind beide false. Und dann passiert bei a nichts mehr, weil if (go1) false ist und damit die einzige Unendlichkeit setTimeout() nicht mehr ausgeführt wird. Ein Designfehler würde ich sagen. Ich würde das übrigens auch nicht mit solchen Zeigern machen sondern die Funktionen an deren Stelle aufrufen.
 
Danke für die Antwort!

Ein Designfehler würde ich sagen.

Naja, b wird beim ersten Durchlauf von a einmal aufgerufen. b braucht aber 10s bis der Call vollendet ist. setTimeout() dauert nur 2ms und verweist dann zurück auf a, daher wäre genug Zeit um ein paar Durchläufe von a zu machen während b läuft.

Beim ersten Aufruf von a => go1 = true, go2 = true

Aufruf von b => go1 = true, go2 = false

Callback auf a => go1 = true, go2 = false (da b noch nicht beendet)

Ende von b => go1 = false, go2 = false

Was passiert ist, dass der Browser setTimeout() in a so lange nicht ausführt bis b beendet ist. Warum ist das so?
 
Zuletzt bearbeitet:
Müsste ich bei mir mal aufbauen die Anordnung. Im Moment bin ich zeitlich etwas knapp.
Kann das vielleicht am Webserver oder an einem anderen Fehler in deiner Testumgebung liegen?
 
Nebenbei:
PHP:
  $i=0;
   while ($i < 10) {
      $i++;
      sleep(1);
   }
ist absolut sinnfrei - sleep(10);...
 
Hi,

sorry für die späte Antwort, hatte sehr viel zu tun.

Kann das vielleicht am Webserver oder an einem anderen Fehler in deiner Testumgebung liegen?

Ich verwende XAMMP for OS X 1.8.3-4. Getestet in Safari 8.0 (welcher schon manchmal Probleme im Bezug auf Ajax und jQuery macht), Chrome 39.0.2171.65 und Firefox 33.1.1.


ist absolut sinnfrei

Vielen Dank für die Info, ist aber im Bezug auf die Fragestellung nicht sonderlich konstruktiv.
Die Schleife repräsentiert eine vereinfachte Version eines Controllers welcher zeilenweise eine Datei einliest und Werte in einer DB abspeichert.
 
Zurück
Oben