我尝试做类似下面的事情。问题是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})
})
})
答案 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问题,而是范围问题。干杯!