Ankündigung

Einklappen
Keine Ankündigung bisher.

Frage/Problem mit XMLHttpRequest async

Einklappen

Neue Werbung 2019

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

  • Frage/Problem mit XMLHttpRequest async

    Es hat keinen Sinn, ich kapiere es nicht, diese Sache mit dem XMLHttpRequest. Bei sync gibt's Mecker in der Konsole und bei async ...
    Also. Meine Frage ist: Bei folgendem Code kann das result des XMLHttpRequest nur innerhalb der function(data) verwendet werden. Das taugt mir nicht wirklich. Gibt es eine Möglichkeit das result des XMLHttpRequest in eine Variable zu packen, die dann auch außerhalb der function(data) verwendet werden kann, bzw. das result als result mit JSONrequest in eine Variable speichern? Fragt mich nicht, mir ist das alles drei mal zu hoch, was ich da schon alles drüber gelesen habe.

    Code:
    function JSONrequest(url, callback)
    {
        var request = new XMLHttpRequest();
        request.overrideMimeType('application/json');
        request.open('GET', url);
        request.onreadystatechange = function()
        {
            if (request.readyState == 4 && request.status == 200)
            {
                callback(JSON.parse(request.responseText));
            }
        };
        request.send();
    }
    
    var JSONurl = 'https://overpass-api.de/api/interpreter?data=[out:json];is_in(49.9854127,8.1257354);out;';
    
    JSONrequest(JSONurl, function(data) {
       console.log(data);
    });
    Soweit der so funktionierende Code. Ich hätte nun gerne das Result des Requests in einer Variable, wie zB:
    Code:
    var result = JSONrequest(JSONurl, function(data) {
       return data;
    });
       console.log(result);
    Oder:
    Code:
    var result;
    JSONrequest(JSONurl, function(data) {
       result = data;
    });
       console.log(result);
    Dass das so nicht funktioniert ist mir klar. Wenn ich wüßte wie, würd ich hier nicht fragen.

    JSFiddle: http://jsfiddle.net/npcmo2ds/1/

  • #2
    pack doch dein retuirn oben in die functionsdefinition, und nicht wie von dir gezeigt in den aufruf.

    da aber bei onreadystatechange ein event getriggert wird, kannst du auch damit arbeiten.
    https://developer.mozilla.org/en-US/...adystatechange

    les mal das, möglicherweise hilft es:
    https://de.wikibooks.org/wiki/Websit...rstes_Programm

    Kommentar


    • #3
      Ahja, Ajax, nee, nix Ajax, auch nix JQuery, nur JavaScript.
      Die Tuts und Docs habe ich mir alle schon mehrmals reingezogen.
      Ich habe oben mal ein JSFiddle reingepackt, da kannst du sowie alle anderen probieren was sie sich denken.

      Wenn return in die JSONrequest function gepackt wird, dann ist das Ergebnis bei async =
      Das funktioniert nur mit sync.
      Vielleicht gibt es auch gar keine andere Lösung für async, möglich.

      Kommentar


      • #4

        new XMLHttpRequest()
        XMLHttpRequest bildet einen Grundbaustein der Ajax-Technik.
        Siehe auch https://de.wikipedia.org/wiki/XMLHttpRequest

        Kommentar


        • #5
          So war das nicht gemeint.

          Kommentar


          • #6
            Hast du denn mal gemacht was tomBuilder dir in Beitrag#2 empfohlen hat.

            Das Ergebnis siehst du auch im Browser wenn du die URL direkt eingibst
            Code:
            https://overpass-api.de/api/interpreter?data=[out:json];is_in(49.9854127,8.1257354);out;

            Kommentar


            • #7
              mit, bei mir geht kein fiddle mehr -> muss wohl ein neuer brwoser her.

              also,
              daß Du das mit dem async verstanden hast ist ja schon mal gut.
              aber:
              - wieso ziehst du nicht request aus der function ?
              - wieso nutzt Du callback nicht um das mit dem ergebniss zu tun, was du willst ?

              so irgendwie aber da ist wohl was falsch...

              Code:
              var callback = function (data) {
              
              //  do something with data ....
              
              }
              
               function JSONrequest(url, callback) {    
                /* (...)     */      
              
                return request;
               }
              request.onreadystatechange = function()     {        
                if (request.readyState == 4 && request.status == 200)         {            
                  callback(JSON.parse(request.responseText);
               } };

              Kommentar


              • #8
                offtopic
                mit, bei mir geht kein fiddle mehr
                Bei mir auch nur halbherzig, ist keine Option mehr für mich.

                Kommentar


                • #9
                  puh ....

                  Kommentar


                  • #10
                    Naja, die Sache ist wohl die, dass es async ist und somit ist die Variable auch erst async verfügbar und nicht vorher, also nicht außerhalb der function, sondern nur mit ihr.
                    Die ganze Sache kann auch sync gemacht werden, dann funktioniert es mit der Variable außerhalb der function, nur ist das deprecated. Also ich habe bereits zwei funktionierende Scripts, in denen die JSON Daten verarbeitet werden, aber leider noch nicht wie gewünscht, was evtl. auch unmöglich ist.
                    Es ist ähnlich wie mit einem
                    addEventListener("click", function() {
                    ...
                    });

                    Kommentar


                    • #11
                      Naja, die Sache ist wohl die, dass es async ist und somit ist die Variable auch erst async verfügbar und nicht vorher, also nicht außerhalb der function, sondern nur mit ihr.
                      Wenn Du meinst; ich gehe davon aus, dass die Ergebnisse vda sind, wenn das event (xmlhttpdrequest) geworfen oder das promise (fetch) eingelösst ist.
                      Mir ist nicht klar wieso Du unbedingt addEventlistener () {} nutzen willst aber gut, ist ja weihnachten:
                      https://stackoverflow.com/questions/...style-property

                      Kommentar

                      Lädt...
                      X