Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 15 von 16
Like Tree1Likes

Thema: Promise-Chain mit For-Loop verbinden ?

  1. #1
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    Promise-Chain mit For-Loop verbinden ?

    Hi!

    Hoffe alle hatten schöne und erholsame F(EIER)tage :-)

    Passend zum Wetter habe ich auch schon wieder eine Frage/Problem. Ich lade ein JSON mit mit einem Array aus Objekten. Jedes Objekt steht für eine Person. Und jedes Objekt hat ein Attribut "name" welches ich nutzen möchte um anschließend ein JSON mit Details zur jeweiligen Person zu laden. Den Inhalt der "Details-JSON" möchte ich dann in das zuvor geladene "Personen-JSON" in das Attribut "details" packen.

    Code sieht folgendermaßen aus:
    Code:
    function fetchPersonen() {
    
      return $http.get('mein-pfad/json/personen.json')
    
        .then(fetchDetails)
        .then(fetchImages)
        .catch(fetchLabelsFailed);
    
      function fetchDetails(response) {
        var res = response.data; // Array mit den Personen
        return loadDetails(res); // lädt pro Person ein JSON-File mit Details
      }
    
      function fetchImages(response) {
        return loadImages(response); // wie Details nur mit Bilder
      }
    }
    
    function loadDetails(response) {
    
      var q = $q.defer();
    
      for (var i = 0; i <= response.length; i++) {
        if (i < response.length) {
          var details2load = 'mein-pfad/json/details/' + response[i].name + '.json';
          var details = $http.get(details2load);
          response[i].details = details;
        }
        else {
          q.resolve(response);
        }
      }
    
      return q.promise;
    }
    Doch so wie ich das mache klappt das nicht so recht - ausserdem wird hier im For-Loop alles quasi in einem Rutsch alles geladen ohne abzuwarten ob das vorherige JSON fertig geladen ist. Weiß hier evtl jemand nen kleinen Anstoß um den richtigen Weg zu finden?
    "640 Kilobyte ought to be enough for anybody."
    Bill Gates, 1981

  2. #2
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.252

    AW: Promise-Chain mit For-Loop verbinden ?

    ausserdem wird hier im For-Loop alles quasi in einem Rutsch alles geladen ohne abzuwarten ob das vorherige JSON fertig geladen ist.
    Ist das ein Problem? Die Einzel-Requests scheinen ja alle unabhängig voneinander zu sein.

    siehe auch: https://developer.mozilla.org/de/doc...ts/Promise/all

    Doch so wie ich das mache klappt das nicht so recht
    Und das heißt was genau?

  3. #3
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    AW: Promise-Chain mit For-Loop verbinden ?

    Zitat Zitat von Dormilich Beitrag anzeigen
    Und das heißt was genau?
    Das Problem liegt eigentlich nicht in dieser Schleife sondern was anschließend in fetchImages() passiert -> die holt Infos aus details und da sind die Detail-JSONs teilweise noch nicht fertig geladen. Das liegt wohl daran dass q.resolve() erfolgt sobald die for-Schleife durch ist und nicht wenn alle JSONs geladen sind.
    Geändert von alphakanal (18-04-2017 um 16:00 Uhr)
    "640 Kilobyte ought to be enough for anybody."
    Bill Gates, 1981

  4. #4
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.252

    AW: Promise-Chain mit For-Loop verbinden ?

    dann ... Promise.all().then(...)

  5. #5
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    AW: Promise-Chain mit For-Loop verbinden ?

    Ok, danke! Werd mich da mal dransetzen -> I'll be back
    "640 Kilobyte ought to be enough for anybody."
    Bill Gates, 1981

  6. #6
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    AW: Promise-Chain mit For-Loop verbinden ?

    Hmm..steh jetzt mal wieder aufm Schlauch.

    Lade meine Detail-JSONs jetzt mit $q.all(), verarbeite es weiter und lass mir das Ergebnis via console Ausgeben -> hier ist es so wie es sein soll.

    Jedoch bekomme ich eine Fehlermeldung mit der ich nichts anfangen kann:
    Possibly unhandled rejection: {} angular.js

    Screenshot der Fehlerdetails:
    fehler.JPG

    Jemand ne Idee was da falsch läuft?
    Geändert von alphakanal (19-04-2017 um 12:43 Uhr)
    "640 Kilobyte ought to be enough for anybody."
    Bill Gates, 1981

  7. #7
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.252

    AW: Promise-Chain mit For-Loop verbinden ?

    nope, mit Angular kenne ich mich nicht aus.

  8. #8
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    AW: Promise-Chain mit For-Loop verbinden ?

    Ich auch ned Was ich halt seltsam finde ist:
    Wenn ich die Details nicht aus separaten JSONs lade und einfüge sondern gleich in die "Personen-JSON" schreibe gibt es den Fehler nicht. Wobei das Ergebnis laut Konsole gleich ist ?!?


    Irgendwie hab ich trotzdem das Gefühl das mein Code auch ned so 100% richtig ist:
    Code:
    function fetchPersonen() {
    
      return $http.get('mein-pfad/json/personen.json')
    
        .then(fetchDetails)
        .then(fetchImages) // wann erhält fetchImages den return wert aus fetchDetails ??
        .catch(fetchLabelsFailed);
    
     function fetchDetails(response) {
      var res = response.data; // Array mit den Personen
      var promises = [];
      for (var i = 0; i < res.length; i++) {
        var promise = $http.get('mein-pfad/json/' + res[i].cn + '.json');
        promises.push(promise);
      }
    
      $q.all(promises)
        .then(function (promises) {
          for (var i = 0; i < res.length; i++) {
          console.log('$q.all.then()', promises[i].data);
            res[i].details = promises[i].data;
          }
    
        });
      return res; // wird das erst zurückgegeben wenn $q.all().then(...) erfolgt ist, nein oder??
    }
    
      function fetchImages(response) {
       ...
      }
    }
    Geändert von alphakanal (19-04-2017 um 13:03 Uhr)
    "640 Kilobyte ought to be enough for anybody."
    Bill Gates, 1981

  9. #9
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.252

    AW: Promise-Chain mit For-Loop verbinden ?

    Zitat Zitat von alphakanal Beitrag anzeigen
    wann erhält fetchImages den return wert aus fetchDetails ??
    wenn fetchDetails fertig ist.

    Zitat Zitat von alphakanal Beitrag anzeigen
    wird das erst zurückgegeben wenn $q.all().then(...) erfolgt ist
    nein, es wird zurückgegeben, wenn .then() aufgerufen wurde. Du mußt die Promise weitergeben, nicht irgendwelche Variablen außerhalb der Promise.

  10. #10
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    AW: Promise-Chain mit For-Loop verbinden ?

    Zitat Zitat von Dormilich Beitrag anzeigen
    wenn fetchDetails fertig ist.
    Das ist komisch: Denn ich lasse in fetchImages via console.log was ausgeben - und das wird VOR dem console.log innerhalb $q.all() .then(...) ausgegeben. Oder hat das nichts zu sagen?

    Zitat Zitat von Dormilich Beitrag anzeigen
    nein, es wird zurückgegeben, wenn .then() aufgerufen wurde. Du mußt die Promise weitergeben, nicht irgendwelche Variablen außerhalb der Promise.
    Glaub hier liegt dann wohl auch der Fehler. Denn meine Absicht war es das Personen-Array ( = res ) in fetchDetails() mit den Details zu erweitern und das erweiterte Personen-Array an fetchImages() weiter zu geben.

    Hmm...aber was muss ich dann hier jetzt dann weitergeben? Das Promises-Array ?

    MeinVerwirrungsIndex++
    Geändert von alphakanal (19-04-2017 um 13:41 Uhr)
    "640 Kilobyte ought to be enough for anybody."
    Bill Gates, 1981

  11. #11
    Avatar von Dormilich
    Dormilich ist offline Kaiser
    registriert
    15-01-2010
    Beiträge
    1.252

    AW: Promise-Chain mit For-Loop verbinden ?

    Das Promise-Return-Schema ist eigentlich gar nicht so kompliziert, allerdings muss man sich konsequent dran halten ...

    PHP-Code:
    var = new Promise(...);

    p.then(function (resolved_value_1) {
        
    // do something with resolved_value_1

        
    return value_or_promise;
    }).
    then(function (resolved_value_2) {
        
    // do something with resolved_value_2

        
    return value_or_promise;
    })
    // usw. 

  12. #12
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.540

    AW: Promise-Chain mit For-Loop verbinden ?

    Zitat Zitat von alphakanal Beitrag anzeigen
    Das ist komisch: Denn ich lasse in fetchImages via console.log was ausgeben - und das wird VOR dem console.log innerhalb $q.all() .then(...) ausgegeben.
    q.all startet ja einen weiteren asynchronen zweig/bzw. wartet auf deren response.
    fetchDetails wartet ja nicht auf dessen ende, sondern returnt gleich. darauf wird fetchImages ausgeführt. das then von q.all wartet dann noch auf das ende aller asynchronen requests

  13. #13
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    AW: Promise-Chain mit For-Loop verbinden ?

    Zitat Zitat von tsseh Beitrag anzeigen
    fetchDetails wartet ja nicht auf dessen ende
    Da liegt wohl auch der Hund begraben...wie könnte ich fetchDetails() dazu bekommen erst zu returnen wenn q.all.then() ausgeführt wird?

  14. #14
    tsseh ist offline Foren-Gott
    registriert
    19-05-2008
    Beiträge
    5.540

    AW: Promise-Chain mit For-Loop verbinden ?

    Code:
    return $q.all(promises)
        .then(function (promises) {
          for (var i = 0; i < res.length; i++) {
          console.log('$q.all.then()', promises[i].data);
            res[i].details = promises[i].data;
            return res[i];
          }
    
        });
    du musst das promise welches q.all zurückliefert zurückgeben. um in fetchImages das array mit den daten zu bekommen, müssen die einzelnen promises welche in q.all gebündelt werden auch daten zurückliefern.
    q.all packt alle daten der einzelnen promises in ein array und übergibt dieses an das nächste callback in der chain

    - - - Aktualisiert - - -

    noch zum verständniss:
    Zitat Zitat von alphakanal Beitrag anzeigen
    wie könnte ich fetchDetails() dazu bekommen erst zu returnen wenn q.all.then() ausgeführt wird?
    fetchDetails "returnt" sofort, das callback fetchImages aber wird erst dann aufgerufen (then), wenn das promise resolved wird.

    - - - Aktualisiert - - -

    wobei ich gerade sehe, dass das auch falsch ist, das sind ja nicht die then-callbacks der einzelnen promisses, sondern vom q.all
    Zitat Zitat von tsseh Beitrag anzeigen
    Code:
    return $q.all(promises)
        .then(function (promises) {
          for (var i = 0; i < res.length; i++) {
          console.log('$q.all.then()', promises[i].data);
            res[i].details = promises[i].data;
            return res[i];
          }
    
        });
    damit musst du res zurückliefern

    Code:
    return $q.all(promises)
        .then(function (promises) {
          for (var i = 0; i < res.length; i++) {
          console.log('$q.all.then()', promises[i].data);
            res[i].details = promises[i].data;
          }
                  return res;
        });
    alphakanal likes this.

  15. #15
    Avatar von alphakanal
    alphakanal ist offline Foren As
    registriert
    03-12-2016
    Beiträge
    92

    AW: Promise-Chain mit For-Loop verbinden ?

    Werd ich morgen gleich dran arbeiten - bin grad unterwegs...vielen Dank schon mal!

Seite 1 von 2 12 LetzteLetzte

Ähnliche Themen

  1. [JQUERY] promise() not work funktioniert nicht
    Von Blackhead77 im Forum JavaScript
    Antworten: 8
    Letzter Beitrag: 17-06-2015, 18:05
  2. Loop
    Von Jackjack im Forum JavaScript
    Antworten: 1
    Letzter Beitrag: 30-06-2012, 13:17
  3. Event Loop
    Von slayer2206 im Forum JavaScript
    Antworten: 5
    Letzter Beitrag: 12-03-2012, 14:33
  4. MP3 als Loop im Hintergrund
    Von neuroscientist im Forum JavaScript
    Antworten: 0
    Letzter Beitrag: 24-08-2006, 14:29
  5. loop
    Von linen im Forum JavaScript
    Antworten: 4
    Letzter Beitrag: 25-11-2004, 10:55

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •