2017-11-17 4 views
1

Zuerst verzeihen Sie meinen etwas mehrdeutigen Titel;Asynchronität eines Mungoversprechens

Szenario

ich Mongoose bin mit ein paar Daten zu holen und machen sie dann mit EJS: Ich konnte nicht eine geeignetere finden. Aus Gründen der Darstellung, Folgendes beachten:

// Schema 
var UserSchema = mongoose.Schema({ 
    Username: String, 
    City: String 
}) 
// Model 
var User = mongoose.model('User', UserSchema); 

Aus meiner Server-Datei:

app.get('/view', function (req, res) { 
    // What I am trying to do    
    User.find({}).exec().then(vals=>{ 
      res.send(vals) 
     }) 

Das Problem

Der obige Code funktioniert wie aber sollte, um den Code zugänglich andere Dateien sowie Upgrades zu erleichtern, möchte ich es eine andere Datei verschieben, dann benötigen() diese Datei.

handler.js

// Promise: Get All Names 
function FetchData(){ 
    return User 
    .find({}) 
    .exec(); 
} 

module.exports = { 
    Get: function(){ 
     val = User.find({}).exec() 
     .then(vals=>{ 
      // Expected to return only after the above is complete 
      return vals 
     }) 
    } 

} 

Dann von meinem Server-Datei:

var handler = require('handler') 

app.get('/view', function (req, res) { 
    res.send(handler.Get()) 
}); 

Leider ist dieser Code nicht als

Meine Gedanken

beabsichtigt funktionieren

Ich änderte die Parameter und änderte den Code ein paar Mal, konnte aber nicht herausfinden, was falsch lief. Es scheint, dass die Werte von Get() zurückgegeben werden, noch bevor das Versprechen konsumiert wird (was verwirrend ist).

Jede Hilfe sehr willkommen sein würde :)

+0

Sie tun können, noch nicht 'return' von der äußeren Funktion innerhalb der Versprechen Rückruf . Sie müssen das Promise-Objekt selbst zurückgeben und das Ergebnis beim Aufrufer mit 'then' konsumieren. Versprechen machen Ihren Code nicht synchron, sie stellen zukünftige Werte nicht sofort zur Verfügung! – Bergi

+0

Gibt es einen Workaround? – Isfaaq

+0

Nein. Es gibt keine Problemumgehung, bis Sie eine Zeitmaschine erfinden. – Bergi

Antwort

0

Ich glaube, Sie so etwas wie dies sein sollte:

module.exports = { 
    Get: function() { 
    return User.find({}).exec() 
     .then(vals => { 
     // Expected to return only after the above is complete 
     return vals 
     }) 
    } 
} 

und dann von Get und dann

app.get('/view', function (req, res) { 
    handler.Get().then((response) => { 
    res.send(response); 
    }); 
}); 

So Rückkehr Versprechen verwenden seine then API.

+0

Der vorgeschlagene Code funktioniert nicht: TypeError: Kann die Eigenschaft 'then' von undefined nicht lesen – Isfaaq

+0

Fehler bedeutet, dass Sie 'Return' nicht zu 'Get' hinzugefügt haben. Überprüfen Sie auch den aktualisierten Code. – dfsq

+0

Das Problem besteht immer noch:/ – Isfaaq

0

Hier ist der Code, der Ihnen helfen kann.

wie Ihre Hauptserver-Datei etwas verändern

app.get('/view', function (req, res) { 
    handler.Get().then(vals => { 
     res.send(vals); 
    }); 

Und in handler.js-Datei können Sie

module.exports.Get = function(){ 
    return new Promise((resolve, reject) => { 
      User.find({}).exec(function(err, users){ 
       if(!err){ 
        resolve(users); 
       } 
      });  
    }); 
} 
Verwandte Themen