Ankündigung

Einklappen
Keine Ankündigung bisher.

Asyncron er ajax Request in Funktion zurückgeben

Einklappen

Neue Werbung 2019

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

  • Asyncron er ajax Request in Funktion zurückgeben

    Ja ich will etwas machen was so nicht so einfach fuktioniert:

    Ich möchte einen Ajax Request in der gleichen Funktion zurückgeben:

    Code:
    function getcontent(type){
        for (i=1;i<=20;i++) {console.log(type+i);
    
            var root = 'https://jsonplaceholder.typicode.com'+ type + i;
    
        var url =ajaxrequest(root);
        console.log(url);
        }
    
    }
    
    function ajaxrequest(url){
    
    $.ajax({
      url: url,
      method: 'GET',
      async: true,
      success: function(response) {
        return response.title;
    } });
    
    }
    Was gibt es da für Lösungen?


  • #2
    Dafür gibts Promises.

    ECMAScript 6: http://exploringjs.com/es6/ch_promises.html

    jQuery: https://api.jquery.com/deferred.promise/

    Angular: https://angularjs.de/buecher/angular...larjs-promises

    Kommentar


    • #3
      Falls einem die Promises etwas schwer im Magen liegen ...

      Ein kleines Beispiel:

      HTML-Code:
      <!doctype html>
      <html lang="en">
      <head>
          <meta charset="UTF-8">
          <title>Promise Test</title>
      <p>My IP: <span id="myIp"></span>
      <script>
          var jsonURL = 'http://ip.jsontest.com/';
          jsonGet(jsonURL).then(function(response) {
              myIp.innerHTML=JSON.parse(response).ip;
          }, function(error) {
              alert(error);
          });
      
          function jsonGet(url) {
            return new Promise(function(resolve, reject) {
              var req = new XMLHttpRequest();
              req.open('GET', url);
              req.onload = function() {
                if (req.status == 200) {
                  resolve(req.response);
                }
                else {
                  reject(Error(req.statusText));
                }
              };
              req.onerror = function() {
                reject(Error("Network Error"));
              };
              req.send();
            });
          }    
      </script>
      Die Unterstützung ist schon ganz gut:

      http://caniuse.com/#feat=promises

      Kommentar


      • #4
        Wenn er eh schon jQuery hat, kann er gleich .then() vom Rückgabewert von $.ajax() verwenden. Ich seh da keinen grund natives JavaScript dazu zu fummeln, mal davon abgesehen, dass der Code so fehlerhaft ist.

        Kommentar


        • #5
          Zitat von hellbringer Beitrag anzeigen
          Wenn er eh schon jQuery hat, kann er gleich .then() vom Rückgabewert von $.ajax() verwenden. Ich seh da keinen grund natives JavaScript dazu zu fummeln, mal davon abgesehen, dass der Code so fehlerhaft ist.

          Habe ich mir gedacht, wo ist es verkehrt?

          Kommentar


          • #6
            Bei dir ist alles außer Status 200 ein Fehler. Also auch 201 Created, 202 Accepted, usw.

            Kommentar


            • #7
              Zitat von hellbringer Beitrag anzeigen
              Bei dir ist alles außer Status 200 ein Fehler. Also auch 201 Created, 202 Accepted, usw.
              Jetzt musstest Du Dir aber schon schwer etwas aus den Fingern saugen um einen "Fehler" zu finden. Mein Beispiel weiter auszuschmücken überlasse ich dem "Oberlehrer" gerne.

              Mich interessiert in diesem Zusammenhang nur der Status 200....

              Warum Du meinen puren Javacript Code immer wieder kritisierst, frage ich mich eh schon etwas länger...

              Kommentar


              • #8
                Zitat von kaminbausatz Beitrag anzeigen
                Jetzt musstest Du Dir aber schon schwer etwas aus den Fingern saugen um einen "Fehler" zu finden.
                Nein, das ist vollkommen offensichtlich und springt einem fast ins Gesicht.

                Zitat von kaminbausatz Beitrag anzeigen
                Mich interessiert in diesem Zusammenhang nur der Status 200....
                Und das macht es besser?

                Zitat von kaminbausatz Beitrag anzeigen
                Warum Du meinen puren Javacript Code immer wieder kritisierst, frage ich mich eh schon etwas länger...
                Weil es so gezwungen ist und oft überhaupt nicht passt. Wenn du siehst, dass derjenige jQuery verwendet, macht es doch wenig Sinn ein Beispiel ohne jQuery zu posten. Man könnte dann genauso ein Beispiel in Angular, React, usw. usf. posten. Oder warum nicht gleich TypeScript?

                Und wenn du schon meinst, du musst eine Alternative posten, dann sollte diese zumindest gleich gut funktionieren wie das "Original", und das tuts in dem Fall eben nicht. Weil der native JavaScript-Code wäre deutlich länger als jQuery-Code, aber diese Tatsache lässt du meist geschickt unter den Tisch fallen, indem du Funktionalität weglässt, die jQuery erfüllen würde. Und dann tust du so, als wäre jQuery unnötig, weil es ja ohne auch nicht mehr Arbeit ist. Natürlich ist es das nicht, wenn du Funktionalität einfach einsparst... Das wäre so, als würde man aus einem Auto alles ausbauen (Rücksitze, Autoradio, Klimaanlage, Airbags, usw. usf.) und dann stolz darauf ist, dass der Spritverbrauch sinkt. Nur so ein Auto will niemand, außer Hardcore-Puristen.

                Kommentar


                • #9
                  Zitat von hellbringer Beitrag anzeigen
                  ...macht es doch wenig Sinn ein Beispiel ohne jQuery zu posten.
                  Das ist doch Quatsch. Der Code sollte beispielhaft zeigen, wie das mit den von Dir in #2 angesprochenen Promises funktioniert.

                  Man kann das auch durch einen simplen CallBack lösen.

                  Natürlich kann man in den paar Zeilen nicht die kompletten 10.000 Zeilen jQuery Code ersetzen.

                  Für die hier gestellte banale Anforderung ist jQuery nicht erforderlich. Das ist in etwa so, als würde ich mit einem LKW meinen Brötchenkauf absolvieren (um beim Beispiel Auto zu bleiben).

                  Davon abgesehen hat das alles auch etwas mit Code-Qualität zu tun, wobei ich Qualität wie folgt definiere. "Erfülle die gestellte Anforderung" – und nicht mehr. Warum sollte ich mich dann also um die Statuscodes 201, 202 usw. kümmern, wenn mich nur der Code 200 interessiert. Das bezahlt keiner. Erweitern kann man den Code immer noch dann, wenn es erforderlich wird.

                  Wenn der TE jQuery einbindet, muss ich das im Beispiel nicht nutzen. Ein myIp.innerHTML = '…' ist nun mal wesentlich effizienter als ein $('#myIp').html('...'). Um exakt zu bleiben - doppelt so schnell.

                  Kommentar


                  • #10
                    Zitat von kaminbausatz Beitrag anzeigen
                    Davon abgesehen hat das alles auch etwas mit Code-Qualität zu tun, wobei ich Qualität wie folgt definiere. "Erfülle die gestellte Anforderung" – und nicht mehr. Warum sollte ich mich dann also um die Statuscodes 201, 202 usw. kümmern, wenn mich nur der Code 200 interessiert. Das bezahlt keiner. Erweitern kann man den Code immer noch dann, wenn es erforderlich wird.
                    Deswegen nimmt man ein Framework, dann hat man die Funktionalität bereits drin und muss später nichts erweitern. Denn das Erweitern bezahlt ja auch keiner, wenn es offenbar Grundfunktionalität ist (HTTP-Standard!).

                    Zitat von kaminbausatz Beitrag anzeigen
                    Wenn der TE jQuery einbindet, muss ich das im Beispiel nicht nutzen. Ein myIp.innerHTML = '…' ist nun mal wesentlich effizienter als ein $('#myIp').html('...'). Um exakt zu bleiben - doppelt so schnell.
                    Sicher ist es das. Aber wenn jemand mit dem Auto von Berlin nach Paris fährt ist es so, als gibst du ihm für eine Teilstrecke eine Beschreibung für öffentliche Verkehrsmittel. Sicher ist letzteres effizienter (in ökologischer Sichtweise), nur bringt das demjenigen nicht viel.

                    Kommentar


                    • #11
                      Zitat von hellbringer Beitrag anzeigen
                      Deswegen nimmt man ein Framework(HTTP-Standard!).
                      .
                      jQuery ist kein Framework.

                      Kommentar


                      • #12
                        Zitat von kaminbausatz Beitrag anzeigen
                        jQuery ist kein Framework.
                        Wenn das das einzige ist, mit dem du nicht einverstanden bist, dann passts ja. Richtigstellung: jQuery ist eine Bibliothek.

                        Kommentar


                        • #13
                          Zitat von hellbringer Beitrag anzeigen

                          Wenn das das einzige ist, mit dem du nicht einverstanden bist, dann passts ja. Richtigstellung: jQuery ist eine Bibliothek.
                          Nö ist es nicht, habe aber keine Zeit mich stundenlang mit anderen Ansichten bzw. angeblich besseren Lösungswegen zu befassen. Mein Code läuft, Du musst ihn ja nicht benutzen.

                          Kommentar


                          • #14
                            Zitat von kaminbausatz Beitrag anzeigen
                            Mein Code läuft, Du musst ihn ja nicht benutzen.
                            Eh nicht, weil er bei mir nicht laufen würde. Was bringt mir Code, der nur in deinem speziellen Szenario funktioniert? Ich kauf ja auch kein Auto, das nur in einem bestimmten Bundesland fahren kann.

                            Kommentar


                            • #15
                              Zitat von hellbringer Beitrag anzeigen

                              Eh nicht, weil er bei mir nicht laufen würde. Was bringt mir Code, der nur in deinem speziellen Szenario funktioniert? Ich kauf ja auch kein Auto, das nur in einem bestimmten Bundesland fahren kann.
                              HTML-Code:
                              alert(atob('ZvxyIG1pY2ggaXN0IGRhcyBUaGVtYSBlcmxlZGlndA=='));

                              Kommentar

                              Lädt...
                              X