Ich erstellen ein Objekt mit Versprechen, aber ich kann das Objekt nicht zurückgeben. console.log("pageStuff inside ", pageStuff)
tröstet das gewünschte Objekt, aber ich kann nicht herausfinden, wie es von der Funktion pageStuff zurückgegeben wird.Rückgabe eines Objekts aus einer Funktion, die meine Versprechen in dieser Funktion zusammengestellt wurde
function pageStuff(incoming){
//pass in comp1
var pageStuff = {}
Reviews.find({companyName : incoming, vote : "down"}).count().exec()
.then(function(returnedDown){
pageStuff.downVotes = returnedDown;
})
.then(function(){
return Reviews.find({companyName : incoming, vote : "up"}).count().exec()
})
.then(function(returnedUp){
pageStuff.upVotes = returnedUp;
})
.then(function(){
return Reviews.find({companyName : incoming}).count().exec();
})
.then(function(totalReviews){
pageStuff.totalReviews = totalReviews
pageStuff.voteResult = pageStuff.upVotes - pageStuff.downVotes;
if(pageStuff.voteResult > 0){
pageStuff.voteResult = "+" + pageStuff.voteResult;
}
})
.then(function(){
Reviews.aggregate([
{$match : {companyName : incoming } },
{$unwind : "$statements"},
{$group : {
_id : "$statements.question",
result : {$avg : "$statements.result"}
}}
]).exec(function(err, doc){
if(err) throw err;
doc.forEach(function(e){
e.result = Math.round(e.result * 10) /10
})
// console.log("doc: " , Array.isArray(doc))
pageStuff.statements = doc;
console.log("pageStuff inside ", pageStuff)
})
})
.catch(function(err){
console.log(err)
})
return pageStuff;
}
Verwendung gibt mir eine leere {}
.
Ich habe das Gefühl, es ist ein asynchrones Problem, aber ich weiß nicht, wie ich es lösen soll.
console.log("pagestuff :::: ", pageStuff("comp1"))
eine var in einer Funktion mit dem gleichen Namen nicht wirklich eine gute Idee ist (pageStuff), außer, dass Ihre Funktion einen Wert zurückgibt synchron, bevor einer der asynchronen Funktionen wirklich anfangen, geschweige denn Ende - also, Sie haben Recht, es ist eine asynchrone Sache, und da Promises keinen asynchronen Code synchron machen, müssen Sie überdenken, was Sie tun, und aufhören zu versuchen, asynch zu synchronisieren, weil Sie das nicht tun können –
Setzen Sie einfach eine Rückkehr vor 'Reviews.find' - dann wird Ihr Code eine Zusage zurückgeben, wenn Sie Ihre Funktion aufrufen, benutzen Sie' .then' wie Sie es mit einem Versprechen tun - aber Sie müssen Ihre Funktion etwas umschreiben Das Bit, um den Wert, den Sie benötigen, erfolgreich zurückzugeben –
Ich habe getan, was Sie über die 'Rückkehr' gesagt haben, welchen Teil sollte ich in meinem Code ändern. 'pageStuff (" comp1 ") .dann (function (returnedData) { console.log (" returnedData ", returnedData) }) gibt mir undefined –