2016-08-07 6 views
0

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"))

+0

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 –

+0

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 –

+0

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 –

Antwort

0

Versprechen sind asynchron und return ist für synchrone Werte.

Einige Möglichkeiten:

  • Sie den Wert nicht zurückgeben Sie interessiert sind, anstatt das Versprechen zurück.. Der Anrufer kann tun, was er in einem auf dem Versprechen tun muss, das es zurückbekommt.

  • Wenn dies beispielsweise eine Bibliothek ist, in der Sie keine Versprechen an Dinge abgeben möchten, die sie verwenden, geben Sie den Wert immer noch nicht zurück. Senden Sie stattdessen ein Ereignis in einer then()-Klausel, wenn Sie über die Daten verfügen, und senden Sie die Daten als Argument an den Ereignishandler. Der Bibliotheksbenutzer sollte einen Handler für das Ereignis auf dem Objekt hinzufügen, das ihn ausgibt, und die Daten im Handler verarbeiten.

0

Ich habe es so gemacht, dass die ganze Funktion ein Versprechen zurückgibt. und dann

und dann rief ich die Funktion, die das Versprechen zurückgegeben und ich habe das Ergebnis. Danke für deine Hilfe.

pageStuff("comp1") .then(function(returnedData){ console.log("returnedData " , returnedData) })

function pageStuff(incoming){ 
    //pass in comp1 
    var returnPageStuff = {} 
    return Reviews.find({companyName : incoming, vote : "down"}).count().exec() 
    .then(function(returnedDown){ 
     returnPageStuff.downVotes = returnedDown; 
    }) 
    .then(function(){ 
     return Reviews.find({companyName : incoming, vote : "up"}).count().exec() 
    }) 
    .then(function(returnedUp){ 
     returnPageStuff.upVotes = returnedUp; 
    }) 
    .then(function(){ 
     return Reviews.find({companyName : incoming}).count().exec(); 
    }) 
    .then(function(totalReviews){ 
     returnPageStuff.totalReviews = totalReviews 
     returnPageStuff.voteResult = returnPageStuff.upVotes - returnPageStuff.downVotes; 
     if(returnPageStuff.voteResult > 0){ 
      returnPageStuff.voteResult = "+" + returnPageStuff.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)) 
      returnPageStuff.statements = doc; 
      console.log("returnPageStuff inside ", returnPageStuff) 

     }) 
     .then(function(){ 
      return returnPageStuff 
     })  
    })  

    .catch(function(err){ 
     console.log(err) 
    }) 


} 
pageStuff("comp1") 
    .then(function(returnedData){ 
     console.log("returnedData " , returnedData) 
    }) 
+0

Ich dachte, das hat funktioniert, aber jetzt weiß ich nicht –

Verwandte Themen