2016-06-16 9 views
0

Ich schreibe eine Knotenroute, die Objekte auf ein Array außerhalb der ForEach-Schleife, nachdem die Objekte eine Eigenschaft hinzugefügt haben, schieben sollte. Wenn ich das Array innerhalb der Schleife trenne, scheint es Daten aufzunehmen, aber wenn ich es an die Client-Seite zurückgebe. Es ist leer.Probleme mit forEach und mongoose findById im Tandem

  var todaysTopItemsBySaleFrequency = []; 

      listOfItemIdsAndSaleFrequency.forEach((item) => { 

       Product.findById(item.itemId).then((foundItem) => { 

        var fullItemData = foundItem.toJSON(); 

        fullItemData.occurrences = item.occurrences; 

        todaysTopItemsBySaleFrequency.push(fullItemData); 

        console.log(todaysTopItemsBySaleFrequency); 

       }); 

      }); 

      return res.status(200).json(todaysTopItemsBySaleFrequency); 

Die console.log Anweisung zeigt, dass das Array genannt todaysTopItemsBySaleFrequency korrekt eingesetzt wird, aber warum ist es leer, wenn ich es an den Client zurückgeben?

Antwort

1

Die Rückruffunktion, die Sie an Product.findById(item.itemId).then(...) übergeben, wird nicht sofort aufgerufen. Ihre äußere forEach wird abgeschlossen und Sie return vor jedem Ihrer Rückrufe aufgerufen.

Mongoose findById() Methode returns a promise. Sie können Promise.all() verwenden, um auf ein Array von Versprechen zu warten, und dann res.status(200).json(...) festlegen. Da dies asynchron geschieht, sollten Sie auch eine asynchrone Schnittstelle präsentieren, indem Sie zB selbst ein Versprechen abgeben.

Hier ist eine Version, die alle Antworten und gibt ein Versprechen, das mit Ihrem ursprünglichen Rückgabewert löst sammelt:

var todaysTopItemsBySaleFrequency = []; 

return Promise.all(listOfItemIdsAndSaleFrequency.map((item) => { 

    return Product.findById(item.itemId).then((foundItem) => { 

     var fullItemData = foundItem.toJSON(); 

     fullItemData.occurrences = item.occurrences; 

     todaysTopItemsBySaleFrequency.push(fullItemData); 

     console.log(todaysTopItemsBySaleFrequency); 

    }); 

})).then(() => res.status(200).json(todaysTopItemsBySaleFrequency)); 
+0

ich diese Anpassungen vorgenommen und was Sie sagen, macht Sinn für mich, aber es scheint, dass Die letzte "then" -Anweisung, die einen Status 200 senden soll, und todaysTopItemsBySaleFrequency, wird nie ausgeführt. Es endet nie. – Mjuice

+0

Hmm ... das Versprechen kann aus irgendeinem Grund abgelehnt werden. Sie könnten versuchen, ein ['.catch (err => console.log (" fehlgeschlagen ", err))'] (https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects) zu setzen/Promise/catch) nach dem letzten '.then()' zu sehen. –