Autor Beitrag
OliverN_26
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Mi 29.08.12 13:00 
Hallo

Ich bin mit meinem Latain am Ende und hoffe ihr könnt mir helfen.
Zum Problem: In einem Javascript benötige ich einen Wert aus meiner MySQL Datenbank den ich mir per XMLHttpRequest hole. Problem ist, das der Javascript Teil schon weiter arbeitet, wenn der Request noch gar nicht eingetroffen ist. Versuche ich das ganze manuell (und unschön) zu verzögern (per timer, while, was auch immer) stürzt der Browser ab. Haue ich vor den Javascript Teil (ans Ende des AJAX-Requests) einen einfach "ALERT" läuft alles wunderbar. Kann mir das bitte mal jemand erklären? Mach ich da was falsch? :-(

Hier mein moderierter Quellcode:
ausblenden volle Höhe JavaScript-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
41:
42:
43:
44:
45:
46:
47:
48:
49:
50:
51:
function pl_sn_artikel(value, id, ind) {
   var xmlHttp = null;
   var sn_art  = false;
     
   // Abrage des Artikels auf einen bestimmten Status
   // -----------------------------------------------     
   if (typeof XMLHttpRequest != 'undefined') { xmlHttp = new XMLHttpRequest(); }
   if (!xmlHttp) { 
      try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {
      try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { xmlHttp = null; } }
   }   
    
   if (xmlHttp && value > 1) {
      var url = "../sql/select.php";
      var params = "Merker=60&artikel="+Grid.cells2(id-12).getValue().toString();
     
      xmlHttp.open("POST", url, true);      
      xmlHttp.setRequestHeader("Content-type""application/x-www-form-urlencoded;charset=UTF-8");
      xmlHttp.setRequestHeader("Content-length", params.length);
      xmlHttp.setRequestHeader("Connection""close");          
      
      xmlHttp.onreadystatechange = function () {
         if (xmlHttp.readyState == 4) {
            var B = xmlHttp.responseText;
            
            // ist der Status "1" wird der Artikel markiert
            // --------------------------------------------
            if (B.substring(0,1) == "1") { sn_art = true; }
         }
      };  
      xmlHttp.send(params);     
   }
      
   // Lasse ich diesen ALERT (der eigentlich keinen Sinn macht) drin läuft alles so wie es soll.
   // Nehme ich ihn allerdings raus bin ich an dieser Stelle viel schneller, als ich den Wert 
   // aus der Datenbank ausgewertet habe, womit die 2.Plausibilitätsprüfung nie eintritt.
   // ------------------------------------------------------------------------------------------
   alert("Vorgang: "+Grid.cells2(id-11).getValue().toString()+" wird angelegt !");
    
   if (isNaN(value) || value == "") {          
      alert("Bitte überprüfen Sie die Mengenangabe !\nDie Eingabe ist unzulässig !");
      return value; 
   }
           
   if (sn_art == true) {
      alert("Für diesen Artikel ist eine Menge größer als '1' unzulässig !\nBitte überprüfen Sie Ihre Eingabe !");
      return value; 
   }   
   
   return true;
};


Vielen Dank im voraus.

lg
Oli

Moderiert von user profile iconChristian S.: Code- durch JS-Tags ersetzt
Christian S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 20451
Erhaltene Danke: 2264

Win 10
C# (VS 2019)
BeitragVerfasst: Mi 29.08.12 14:08 
Hallo!

Alles, was von dem Ergebnis des Requests abhängt, musst Du im Handler des OnReadStateChanged-Ereignis abarbeiten. Der Request läuft nunmal asynchron und nur in dem Event-Handler weißt Du, dass er fertig ist.

Grüße,
Christian

_________________
Zwei Worte werden Dir im Leben viele Türen öffnen - "ziehen" und "drücken".
OliverN_26 Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 252

Win7 64-Bit, WinXP SP3
Delphi 7 Enterprise
BeitragVerfasst: Mi 29.08.12 14:32 
Hallo

Das dachte ich mir bereits aber ich komm so trotzdem nicht weiter. Vielleicht hast du ja einen Tip? Diese Funktion wird aus einer anderen aufgerufen und muß "true" / "false" zurück liefern. Den Wert "true" erreiche ich aber nie da er sofort ans Ende springt und das Thema für ihn damit durch ist.

Hier der neue Code (vielleicht is es so deutlicher):
ausblenden volle Höhe JavaScript-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
29:
30:
31:
32:
33:
34:
35:
36:
37:
38:
39:
40:
function pl_sn_artikel(value, id, ind) {
   var xmlHttp = null;
          
   if (typeof XMLHttpRequest != 'undefined') { xmlHttp = new XMLHttpRequest(); }
   if (!xmlHttp) { 
      try { xmlHttp = new ActiveXObject("Msxml2.XMLHTTP"); } catch(e) {
      try { xmlHttp = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) { xmlHttp = null; } }
   }   
    
   if (isNaN(value) || value == "") {          
      alert("Bitte überprüfen Sie die Mengenangabe !\nDie Eingabe ist unzulässig !");
      return value; 
   }
   
   if (xmlHttp && value > 1) {
      var url = "../sql/select.php";
      var params = "Merker=60&artikel="+Grid.cells2(id-12).getValue().toString();
     
      xmlHttp.open("POST", url, true);      
      xmlHttp.setRequestHeader("Content-type""application/x-www-form-urlencoded;charset=UTF-8");
      xmlHttp.setRequestHeader("Content-length", params.length);
      xmlHttp.setRequestHeader("Connection""close");          
      
      xmlHttp.onreadystatechange = function () {
         if (xmlHttp.readyState == 4) {
            var B = xmlHttp.responseText;
            if (B.substring(0,1) == "1") { 
               alert("Für diesen Artikel ist eine Menge größer als '1' unzulässig !\nBitte überprüfen Sie Ihre Eingabe !");
               return value;
            } else { 
                // Hier ist die Problemzeile denn die wird nie erreicht,
                // da vorher schon unten angekommen ist und "false" meldet
                // -------------------------------------------------------
                return true;
            }
         }
      };  
      xmlHttp.send(params);     
   } else { return true; }
};


Bin für jeden Tip dankbar

lg
Oli

Moderiert von user profile iconChristian S.: Code- durch JS-Tags ersetzt