Ankündigung

Einklappen
Keine Ankündigung bisher.

Return von Ajax funktion ist immer 0

Einklappen
X
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • Return von Ajax funktion ist immer 0

    Hallo Leute,

    ich hätte eine Frage bezüglich einer Ajax Funktion von mir die ich mit Phonegap verwende. Diese sieht folgendermaßen aus:

    Code:
    class global {
    
        checkServerConnection() {
            let data = 0;
    
            let ajax = new XMLHttpRequest();
            ajax.open("GET", "http://......", true); // Rückgabewert ist hier "Connected
            ajax.send();
    
            ajax.onreadystatechange = function() {
                if (ajax.readyState === 4 && ajax.status === 200) {
                    data = ajax.responseText;
                    console.log("Funktion: " + data); <<<----- Consolen Log
                    } // end readyState
                }; // end onreadystatechange
    
            return data;
            } // end checkServerConnection
    
        constructor() {
    
            let connect = this.checkServerConnection();
            console.log("Consturctor: " + connect); <<<-------- Consolen Log
            if(connect === "Connected") { console.log("Server ist Verbunden"); }
    
            console.log('gloabal Class Loadet');
            }
    
        }
    Ich weiß, dass um nur die Verbindung zu checken ich keinen Rückgabewert im "Text-Format" benötige. Ich benötige das dann für eine andere Funktion und würde daher jetzt bereits gerne wissen wie ich das Problem Lösen kann.
    Das Problem ist Folgendes:
    Im Constructor hat der zurück gegebene Wert immer 0.
    in der checkServerConnection() Funktion gibt er korrekt "Connected" aus.

    Consolen Log sieht so aus:

    Constructor: 0
    global Class loadet
    Funktion: Connected


    Es scheint als würde er die Funktion einmal überfliegen, den Rückgabe wert verwenden und dann erst die onreadystatechange Funktion öffnen.

    Vielen Dank für eure Hilfe!

    Liebe Grüße


  • #2
    AJAX ist wie der Name schon sagt asynchron. Das heißt data wird erst nach dem return befüllt. Aber da ist die Funktion schon lange beendet.

    Demo:
    Code:
    function myAsyncFunction() {
        var promise = new Promise((resolve, reject) => {
            // simulate async loading
            setTimeout(() => {
                resolve('foo');
            }, 2000);
        });
    
        return promise;
    }
    
    myAsyncFunction().then(returnValue => {
        alert(returnValue);
    });
    https://jsfiddle.net/r6xxej9v/1/

    Kommentar


    • #3
      Zitat von TheRat101 Beitrag anzeigen
      Es scheint als würde er die Funktion einmal überfliegen, den Rückgabe wert verwenden und dann erst die onreadystatechange Funktion öffnen.
      Bingo. Nennt sich asynchron.

      Kommentar


      • #4

        Dazu kann man doch "async" auf false setzen.

        PHP-Code:
        <?php
        function quadrat($a){
         return 
        $a*$a;
        }
        echo 
        quadrat($_POST['a']);
        ?>

        PHP-Code:
        <!DOCTYPE HTML>
        <
        html>
        <
        head>
        <
        title>Untitled</title>
        <
        script src="jquery-1.10.1.js" type="text/javascript"></script>
        <script type="text/javascript">
        <!--
        $(document).ready(function(){
          var erg = 0;
          $.ajax({
          url: "__quadrat.php",
         data: {a: 12},
         method: "POST",
         // wird async auskommentiert, bleibt erg=0, wie oben initialisiert
         async: false,
         success: function(data){erg = data;}
         });
         alert(erg);
        });
        // -->
        </script>
        </head>
        <body>
        </body>
        </html> 
        Gruß

        Kommentar


        • #5
          Zitat von Günni Beitrag anzeigen
          Dazu kann man doch "async" auf false setzen.
          Davon würde ich abraten, da sonst der Client blockiert wird. Und streng genommen ist das kein AJAX mehr, sondern ein synchroner Request.

          Kommentar


          • #6
            Zitat von Günni Beitrag anzeigen
            Dazu kann man doch "async" auf false setzen.
            Oder Promises(, Observables, Callbacks, async/await, ..) verwenden.

            Kommentar


            • #7
              Damit habe ich auf jeden Fall jetzt ein paar gute Lösungsansätze. Danke euch.
              Bitte entschuldigt wenn die Frage etwas zu einfach war. Javascript mache ich nur nebenbei ein wenig

              Vielen Dank euch

              Liebe Grüße

              Kommentar

              Lädt...
              X