从函数中返回一个对象,该函数将我的承诺放在该函数中

时间:2016-08-07 00:25:40

标签: javascript node.js object mongoose promise

我使用promises创建了一个对象但是我无法返回该对象。 console.log("pageStuff inside ", pageStuff)控制所需的对象,但我无法弄清楚如何从pageStuff函数返回它。

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;        

}

使用它会给我一个空的{}

我感觉这是一个异步问题,但我不知道如何解决它。

console.log("pagestuff :::: ", pageStuff("comp1"))

2 个答案:

答案 0 :(得分:0)

Promise是异步的,return是同步值。

一些可能性:

  • 不要返回您感兴趣的值。请返回承诺。调用者可以在.then()中执行他们需要做的事情。

  • 例如,如果这是一个您不希望将承诺泄露给使用它的东西的库,那么仍然不会返回该值。相反,当您拥有数据并将数据作为参数发送到事件处理程序时,在then()子句中发出事件。库用户应该在发出它的对象上添加事件处理程序并处理处理程序内的数据。

答案 1 :(得分:0)

我做了它,以便整个函数返回一个promise。然后

然后我调用了返回promise的函数 我得到了结果。谢谢你的帮助。

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