尝试从不同的查询中获取数据以使用promises在页面上呈现

时间:2016-07-30 02:32:53

标签: javascript node.js express mongoose promise

我尝试做类似下面的事情。问题是console.log(reviews)输出undefind我希望它被定义,所以我可以在渲染中使用它。它可能是未定义的,因为变量不会因为异步活动而被设置。

app.get("/company/:comp", checkIfAuthed , function(req,res){

    var reviews;
    Reviews.find({companyName : req.params.comp}).exec()
    .then(function(reviews){
        reviews = reviews;
        return Comps.findOne({name : req.params.comp}).exec();
    })
    .then(function(comp){
        console.log(reviews)
         res.render("indivComp", {authed :app.locals.authed, user : app.locals.user, comp : comp, reviews : reviews})
    })
})

3 个答案:

答案 0 :(得分:0)

如果您需要在代码完成之前完成两项承诺。你可以使用

Promise.all([promise1(), promise2()]).then(function (obj) {});

obj将按照收到的顺序包含一系列回复。因此,obj[0]将是promise1的结果,obj[1]将是promise2的结果。从那里,你应该有两个回复的数据,你可以用它做你想做的事。

这是你如何使用角度进行的,但同样的概念适用于非角度解决方案:

$scope.p1 = function () {
    return $http({
        method: 'GET',
        url: '/some/url'
    });
}

$scope.p2 = function () {
    return $http({
        method: 'GET',
        url: '/some/url'
    });
}

$q.all([p1(), p2()]).then(function (obj) {
    var p1Response = obj[0];
    var p2Response = obj[1];
});

答案 1 :(得分:0)

问题是你在.then中有reviews作为参数,这意味着外部reviews var被参数掩盖了......将参数名称更改为其他名称,例如x,然后更改下一行reviews = x;

app.get("/company/:comp", checkIfAuthed , function(req,res){

    var reviews;
    Reviews.find({companyName : req.params.comp}).exec()
    .then(function(x){
        reviews = x;
        return Comps.findOne({name : req.params.comp}).exec();
    })
    .then(function(comp){
        console.log(reviews)
         res.render("indivComp", {authed :app.locals.authed, user : app.locals.user, comp : comp, reviews : reviews})
    })
})

答案 2 :(得分:0)

这是你的代码

app.get("/company/:comp", checkIfAuthed , function(req,res){

var reviews;
Reviews.find({companyName : req.params.comp}).exec()
.then(function(reviews){
    reviews = reviews;
    return Comps.findOne({name : req.params.comp}).exec();
})
.then(function(comp){
    console.log(reviews)
     res.render("indivComp", {authed :app.locals.authed, user : app.locals.user, comp : comp, reviews : reviews})
    })
})

问题是范围界定问题

 reviews = reviews; // references itself in that scope

不会改变

的上限
 var reviews; // remains undefined

因此

 console.log(reviews); // Accesses the upper function scope and to search and finds var reviews which is undefined

因此,@ jaromanda-x建议更改第一个函数参数

 .then(function(reviews){
     reviews = reviews;
     return Comps.findOne({name : req.params.comp}).exec();
  })

我建议:

 .then(function(receivedReviews){
      reviews = receivedReviews;
      return Comps.findOne({name : req.params.comp}).exec();
  })

详细,但更明确! 显然它不是asyc问题,而是范围问题。干杯!