• Das Erstellen neuer Accounts wurde ausgesetzt. Bei berechtigtem Interesse bitte Kontaktaufnahme über die üblichen Wege. Beste Grüße der Admin

Viele Ajax request - async:false - mit timeout realisieren

IT Format

New member
Hallo an alle,

Ich habe ein Problem mit sync ajax aufrufen die, bei Bedarf, mit einem Timeout beendet werden müssen.
Das Script das ich da geschrieben habe funktioniert soweit gut und das timeout fasst auch sobald ich async auf true setze. Da der Server den ich abfrage aber nur eine Abfrage gleichzeitig annehmen kann bin ich auf async: false angewiesen.

Gibt es einen work around der es mir erlaubt das auch mit false zu benutzen?

Aufgabenstelleung ist folgende:
In einem XML File sind zwischen 10 und 2000 Artikelanfragen. nachdem das XML File hochgeladen wurde und die Artikel herausgefiltert sind wird eine Tabelle mit allen Artikeln angezeigt.
Nun gibt es verschiedene Warenwirtschaften wo ich diese Artikel jetzt anfragen muss, daher gib es nun z.B 3 spalten mit Warenwirtschaft1 - 3.

Wenn ich nun bei Warenwirtschaft1 auf start drücke, soll er ein php file auf dem selben server aufrufen welches den Artikelchck vornimmt. Der Rückgabewert wird ausgewertet und entsprechend entweder ein grüner oder roter Punkt, oder wenn die Abfrage in ein timeout kommt ein Fragezeichen.

Da die Warenwirtschaft die ich anfragen muss in Amerika ist und der Server nur max 1 anfrage zur gleichen Zeit annimmt, muss ich schon mal sync abfragen. Da aber auch von Zeit zu Zeit ein timeout kommt, hängt sich das script leider immer auf.

Vielleicht gibt es ja wen hier der mir da ein wenig auf die Sprünge helfen könnte. Ich habe so ziemlich alles was ich mir vorstellen konnte schon in Google eingetippt.

Wie schon gesagt das script läuft gut und geht jeweils einen Eintrag nach dem anderen durch, leider funktioniert das timeout bei sync abfrage nicht!

zu guterletzt noch einmal das Script in der bisherigen Form:
hier das Beispiel für die amerikanische Version:
PHP:
$(function() {
	$("#check_nsusa").bind("click", function() {
		$("#check_nsusa").attr('src', './images/status.gif');
		var fetching = $.when();
		$("img.check_nsusa").each(function (i) {
			var val = $(this).attr('id');
			var valu = $(this).attr('ids');
			var responseData;
		    fetching = fetching.pipe(function (jqXHR, exception, message) {
				$.ajax({
					url: './check_ns_usa.php?search=' + valu,
				    timeout: 15000,
				    async: false,
				    beforeSend: function(){
				    	$('#'+val).attr('src', './images/status2.gif');
				    },
				    success: function(json){
						if(json == "9") {
							$('#'+val).attr('src', './images/status_bad.png');
						} 
						else if(json == "2") {
							$('#'+val).attr('src', './images/status_verygood.png');
						} 
						else if(json == "1") {
							$('#'+val).attr('src', './images/status_good.png');
						} 
						else {
							$('#'+val).attr('src', './images/status_unknown.png');
						}
				    	responseData = json;
				    },
			        error: function(jqXHR, exception, message) {
			        },
				    complete: function(jqXHR, exception, message) {
				    	if (exception == 'error')  {
				        	$('#'+val).attr('src', './images/status_unknown.png');
				    	}
					}
				})
				.done(function ( data ) {
					
				});
		    });
		});
		fetching.done(function (jqXHR, exception, message) {
			$("#check_nsusa").attr('src', './images/tick.png');
		});
	});
});
object.png
 
Zuletzt bearbeitet:
Schon mal mit einer Rekursion versucht?
PHP:
$(function() {
  $("#check_nsusa").bind("click", function() {
    $("#check_nsusa").attr('src', './images/status.gif');
    var fetching = $.when();
    $("img.check_nsusa").each(function (i) {
      var val = $(this).attr('id');
      var valu = $(this).attr('ids');
      var responseData;
      fetching = fetching.pipe(function (jqXHR, exception, message) {
        var ajaxCall = $.ajax({
          url: './check_ns_usa.php?search=' + valu,
          async: false,
          beforeSend: function(){
            $('#'+val).attr('src', './images/status2.gif');
          },
          success: function(json){
            if(json == "9") {
              $('#'+val).attr('src', './images/status_bad.png');
            } 
            else if(json == "2") {
              $('#'+val).attr('src', './images/status_verygood.png');
            } 
            else if(json == "1") {
              $('#'+val).attr('src', './images/status_good.png');
            } 
            else {
              $('#'+val).attr('src', './images/status_unknown.png');
            }
            responseData = json;
          },
          error: function(jqXHR, exception, message) {
            setTimeOut(ajaxCall, 5000);
          },
          complete: function(jqXHR, exception, message) {
            if (exception == 'error')  {
              $('#'+val).attr('src', './images/status_unknown.png');
            }
          }
        })
        .done(function ( data ) {
          
        });
      });
    });
    fetching.done(function (jqXHR, exception, message) {
      $("#check_nsusa").attr('src', './images/tick.png');
    });
  });
});
 
Ich habe ein Problem mit sync ajax aufrufen die, bei Bedarf, mit einem Timeout beendet werden müssen.
Das Script das ich da geschrieben habe funktioniert soweit gut und das timeout fasst auch sobald ich async auf true setze. Da der Server den ich abfrage aber nur eine Abfrage gleichzeitig annehmen kann bin ich auf async: false angewiesen.
Wieso? Du kannst auch asynchrone Abfrage so gestalten, dass immer nur eine ausgeführt wird.
 
Schon mal mit einer Rekursion versucht?

nein nicht wirklich, ich Programmiere seit Jahren PHP und habe von Ajax etc recht wenig Ahnung...

Ich habe gerade einmal die Funktion mit setTimeOut(ajaxCall, 5000); erweitert...
Wahrscheinlich muss ich diese Funktion auch noch definieren?!

Sobald ich keine Antwort von Server bekomme gibt das Script:

"NetworkError: 500 Internal Server Error - http://webseite.bsp/check_ns_usa.php?search=92Y5557"

Mein Firefox FireBug hat folgendes in der Konsole stehen:
undefined error Internal Server Error in testusa2.php (Zeile 55) // das ist der Aufruf der PHP Datei check_ns_usa.php ...
ReferenceError: setTimeOut is not defined
 
Wieso? Du kannst auch asynchrone Abfrage so gestalten, dass immer nur eine ausgeführt wird.

Hmm das wäre natürlich auch sehr fein. Habe mir das Script in Tagen Arbeit mit viel google Sucherei so zusammengeschrieben. Bin leider kein Experte in JS und ajax...

Anfangs konnte ich das noch alles mit PHP machen... nur als dann Anfragen mit 1000+ Artikeln kamen wurde die Laufzeit zu hoch. Dann bin ich angefangen mit jq und ajax zu experimentieren.
Das script läuft ja auch gut... nur wenn der Abzufragende Server nicht antwortet hängt sich alles auf. Das muss ich noch abfangen. Wenn du da auch noch einen Tip hättest wie ich das mit async:true hinbekomme.... sehr gerne :)
 
nein nicht wirklich, ich Programmiere seit Jahren PHP und habe von Ajax etc recht wenig Ahnung...

Ich habe gerade einmal die Funktion mit setTimeOut(ajaxCall, 5000); erweitert...
Wahrscheinlich muss ich diese Funktion auch noch definieren?!

Sobald ich keine Antwort von Server bekomme gibt das Script:

"NetworkError: 500 Internal Server Error - http://webseite.bsp/check_ns_usa.php?search=92Y5557"

Mein Firefox FireBug hat folgendes in der Konsole stehen:
undefined error Internal Server Error in testusa2.php (Zeile 55) // das ist der Aufruf der PHP Datei check_ns_usa.php ...
ReferenceError: setTimeOut is not defined


Die Funktion wird doch definiert var ajaxCall = $.ajax({...

Und bei setTimOut ist mir ein Fehler unterlaufen, es heißt natürlich setTimeout
 
Die Funktion wird doch definiert var ajaxCall = $.ajax({...

Und bei setTimOut ist mir ein Fehler unterlaufen, es heißt natürlich setTimeout

Ok soweit habe ich das geändert...

und hatte noch nen kleinen Fehler drin!

Jetzt läuft es wunderbar durch :) Danke dir :)

Gibt es denn jetzt noch eine Möglichkeit die Laufzeit des Scriptes zu beeinflussen?
z.B. das er nach 15 sekunden zum nächsten übergeht? Ist nicht lebensnotwendig, wäre aber noch etwas schicker dann ? :)
 
Zuletzt bearbeitet:
Das macht die ganze sache ja eher noch schlimmer, da bei einem Fehler einfach der gleich Aufruf nochmal gestartet werden soll. Was ja gar ncith das Problem war. Ausserdem sind setTimeout keine Rekursiven Aufrufe! Rekursion ist, wenn eine Funktion sich selbst aufruft, was mit Timeout nie passieren kann

Dein Problem ist, dass du alle Ajax Aufrufe gleichzeitig machst, in der .each() Schleife. du darfst aber immer nur einen machen (laut deinen Vorgaben) und dann erst den nächsten, dafür bietet sich das success Event des Ajax Objekt an. Da du das ganze nicht in einer Schleife machen kannst, musst du dir den Selektor als Array zurück geben und dann immer ein Element z.b. mit shift() holen.
 
Das macht die ganze sache ja eher noch schlimmer, da bei einem Fehler einfach der gleich Aufruf nochmal gestartet werden soll. Was ja gar ncith das Problem war. Ausserdem sind setTimeout keine Rekursiven Aufrufe! Rekursion ist, wenn eine Funktion sich selbst aufruft, was mit Timeout nie passieren kann

Dein Problem ist, dass du alle Ajax Aufrufe gleichzeitig machst, in der .each() Schleife. du darfst aber immer nur einen machen (laut deinen Vorgaben) und dann erst den nächsten, dafür bietet sich das success Event des Ajax Objekt an. Da du das ganze nicht in einer Schleife machen kannst, musst du dir den Selektor als Array zurück geben und dann immer ein Element z.b. mit shift() holen.

Das mit der Rekursion hatte ich auch nicht wirklich erkannt... wollte aber nicht näher darauf eingehen da das script ja mit dem Umbau sehr gut funktioniert.
Es geht Zeile für Zeile durch und liefert mir den gewünschten Rückgabewert, oder wenn der Server mal kurz nicht erreichbar ist übergeht er den Fehler und springt zum nächsten.

Da ich mich bisher zu wenig mit java script ajax etc auseinandergesetzt habe werde ich gerne einmal auch deinen Lösungsansatz veruschen zu bauen.
Kann ich mit deiner Methode realisieren das ich

- alle Artikel einzelnd nacheinander abrufe
- in der Lage bin einen zulangen Request vorzeitig zu beenden (15 Sekunden)
- einen vorzeitig beendeten oder abgebrochenen Wert neu zu starten. (10 Wiederholungen)
- nach 10 Versuchen soll der dann endgültig beendet werden und der nächste Artikel geprüft werden

Das wäre das goldene Ei wo ich hinmöchte.
Wäre das mit der Methode zu machen?
Da müsste dann doch auch die Rekrusion eine Rolle spielen bei den 10 Wiederholungen...

Was wäre der richtige Ansatz? Da in den Posts oben weiter auch davon gesprochen wurde das mit async:true zu machen, wäre es da möglich die Werte nacheinander anzufragen?

Was macht am meisten Sinn ???

Danke für eure Hilfe!!!
 
Ja das würde alles gehen, bei einer asychronen AJAX Bearbeitung. Jetzt ist es so, dass der Browser während der Abfrage komplett blockiert wird.
 
Um das mal zu veranschaulichen
HTML:
<div id="hole">
<div id="a"></div>
<div id="b"></div>
<div id="c"></div>
</div>
    <script type="text/javascript" >
      $(document).ready(function() {
		  var list = $('#hole div').toArray();
		  getNext(list);
      });
      function getNext(list){
		  if(list.length){
			  var next = list.shift();
			  $.ajax('test.php', {
				   data: {id: next.id},
				   success: function(data){
					   $('#'+next.id).html(data);
					   getNext(list);
				   },
				   error: function(a, b){
					   alert('Fehler: ' + b);
				   }
			   });
		  }else {
			  alert('fertig');
		  }
	  }
    </script>
 
Um das mal zu veranschaulichen
HTML:
<div id="hole">
<div id="a"></div>
<div id="b"></div>
<div id="c"></div>
</div>
    <script type="text/javascript" >
      $(document).ready(function() {
		  var list = $('#hole div').toArray();
		  getNext(list);
      });
      function getNext(list){
		  if(list.length){
			  var next = list.shift();
			  $.ajax('test.php', {
				   data: {id: next.id},
				   success: function(data){
					   $('#'+next.id).html(data);
					   getNext(list);
				   },
				   error: function(a, b){
					   alert('Fehler: ' + b);
				   }
			   });
		  }else {
			  alert('fertig');
		  }
	  }
    </script>

Hey cool!

Das wurde wirklich sehr gut erläutert!
Ich werde mich morgen früh daran machen die Sachen so umzusetzen.
Wenn ich soweit bin werde ich dir das Ergebniss posten.

Besten Dank! :)
 
Naja, Crossposts sind unhöflich, da wir damit rechnen müssen uns die gleichen Gedanken machen zu müssen, wie die anderen Leser dort. Höflich und üblich sollte es sein, dass man auf solche Crossposts hinweist.
 
Zurück
Oben