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 funktionierenIch ä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 :)
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
Gibt es einen Workaround? – Isfaaq
Nein. Es gibt keine Problemumgehung, bis Sie eine Zeitmaschine erfinden. – Bergi