2016-07-30 17 views
1

Ich habe versucht, etwas wie unten zu tun. Das Problem ist console.log(reviews) Ausgänge undefind Ich wollte es definiert werden, damit ich es in den Render verwenden konnte. Es ist wahrscheinlich nicht definiert, da die Variable wegen asynchroner Aktivitäten nicht gesetzt wird.versucht, Daten aus verschiedenen Abfragen auf Seite mit Versprechen zu rendern

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

Antwort

0

das Problem ist, dass Sie reviews innerhalb des .then als Parameter haben, die die äußere Mittel reviews var wird durch den Parameter maskiert ... Ändern Sie den Parameternamen in etwas anderes, z x, dann die nächste Zeile 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}) 
    }) 
}) 
0

Wenn Sie beide Versprechungen benötigen, um abzuschließen, bevor Ihr Code es tut, ist es Sache. Sie können

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

obj wird eine Reihe von Ihren Antworten in der Reihenfolge enthalten, in denen verwenden sie empfangen wurden. Also, obj[0] wird das Ergebnis von promise1 und obj[1] wäre das Ergebnis von promise2. Von dort sollten Sie Daten aus beiden Antworten haben und Sie können damit machen, was Sie wollen.

Dies ist, wie Sie es Winkel mit tun können, aber das gleiche Konzept gilt in einer nicht-Winkel Lösung:

$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]; 
}); 
0

ändern Dies ist der Code

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

Das Problem ist eine Frage der Scoping

reviews = reviews; // references itself in that scope 

Ist der obere Rahmen des

nicht ändern
var reviews; // remains undefined 

Deshalb

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

So wie @ jaromanda-x schlägt vor, die die ersten Funktionsparameter

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

ändern werde ich vorschlagen:

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

ausführlich, aber deutlicher! Offenbar war es nicht asyc Problem, aber Umfang Problem. Prost!