0
supportChat: function(){ 
    return functions.https.onRequest((req, res) => { 
     var userId = req.query.userId; 
     var object = {}; 
     db.ref("https://stackoverflow.com/users/-KwZ2N38Q6a1a87p982/threads").orderByKey().once('value').then(function(snapshot) { 
      var snap = snapshot.val(); 
      var keys = Object.keys(snap); 

      for (var i = 0; i < keys.length; i++){ 
       k = keys[i]; 
       db.ref("/threads/"+k+"/lastMessage").orderByKey().once('value').then(function(snapshot){ 
        var snapshot = snapshot.val(); 
        if (snapshot[i]["sender"] != "-KwZ2N38Q6a1a87p982"){ 
         object[snap[i]["messageID"]] = snapshot; 
        } 
       }); 
      } 
      console.log(object); 
      return res.status(200).send(object); 
     }); 
    }); 
}, 

Jeder Benutzer in meiner Datenbank hat ein Thread-Kind, das alle Chat-Threads anzeigt, die sie haben. Dann haben wir einen anderen Thread-Abschnitt der Datenbank, der alle Daten dieses Threads enthält.Wie mache ich eine verschachtelte Datenbankabfrage innerhalb einer for-Schleife?

Was ich versuche zu tun ist zu überprüfen, eine bestimmte Benutzer Threads-IDs für den Thread-Abschnitt der Datenbank, um alle Threads zu finden, wo die letzte Nachricht im Thread nicht von mir (aktueller Benutzer) gesendet wurde.

Ich habe keine Ahnung, warum ich damit zu kämpfen habe. Was ist der richtige Weg, um alle snapshot.val() von jedem Thread, der meine Bedingung erfüllt, an den Endpunkt auf einmal zu senden? Vielleicht ist mein Ansatz weit entfernt.

Antwort

1

Um zu wissen, wenn alle Versprechungen in Ihrer for Schleife erledigt sind, können Sie das Array der Versprechen sammeln, die Sie aus der Schleife erhalten und dann Promise.all() verwenden, um zu wissen, wann sie fertig sind.

Sie müssen auch schützen Sie Ihre for Schleife Index, so dass jeder Aufruf der for Schleife behält seinen eigenen Index, so ist es immer noch korrekt, wenn Ihre asynchrone Handler aufgerufen wird. Sie können das tun, indem Sie Ihre for Schleife wechseln, um let i statt var i zu verwenden.

supportChat: function(){ 
    return functions.https.onRequest((req, res) => { 
     let userId = req.query.userId; 
     let object = {}; 
     db.ref("https://stackoverflow.com/users/-KwZ2N38Q6a1a87p982/threads").orderByKey().once('value').then(function(snapshot) { 
      let snap = snapshot.val(); 
      let keys = Object.keys(snap); 
      let promises = []; 

      for (let i = 0; i < keys.length; i++){ 
       let k = keys[i]; 
       promises.push(db.ref("/threads/"+k+"/lastMessage").orderByKey().once('value').then(function(snapshot){ 
        let snapshot = snapshot.val(); 
        if (snapshot[i]["sender"] != "-KwZ2N38Q6a1a87p982"){ 
         object[snap[i]["messageID"]] = snapshot; 
        } 
       })); 
      } 
      return Promise.all(promises).then(() => { 
       console.log(object); 
       return res.send(object); 
      }); 
     }).catch(err => { 
      console.log(err); 
      return res.sendStatus(500); 
     }); 
    }); 
}, 

Kommentare auf dem Code:

FYI, wenn Sie versuchen, tatsächlich etwas zurück von der supportChat() Funktion, bitte angeben, was das ist. Im Moment ist nicht klar, was Sie von diesem Funktionsaufruf erwarten.


Und Sie brauchen nicht die .status(200) Teil davon:

res.status(200).send(object); 

Sie können einfach tun:

res.send(object); 

wie von selbst, und das wird automatisch den Status verwenden 200.


Und Sie benötigen einen .catch()-Handler, um Fehler abzufangen und eine Antwort im Fehlerzustand zu senden.

+0

Danke! Sieht viel robuster aus! Ich habe das versucht, aber als es lief, gab es nur ein Nachrichtenobjekt zurück (ein Ergebnis). Es gibt jedoch Hunderte. Wo denkst du könnte es schief gehen? – ryangineer

+0

@ryangineer - Hast du die 'var i' in' let i' in deiner 'for' Schleife geändert, wie ich es gezeigt habe? Dies ist erforderlich, damit nicht alle Ergebnisse den gleichen Index verwenden. – jfriend00

+0

machte eine kleine Änderung an meinem Ende (kleiner Tippfehler). und hab es geschafft! Das hat super geklappt! thannnnkkk youuuuuuu. – ryangineer

Verwandte Themen