蒙古承诺的异步性

时间:2017-11-17 15:36:48

标签: mongoose promise ejs

首先,请原谅我略带模糊的标题;我找不到更合适的一个:

方案

我使用Mongoose获取一些数据然后用ejs渲染它们。为了便于说明,请考虑以下事项:

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

从我的服务器文件:

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

问题

上面的代码按预期工作,但是,对于其他文件可访问的代码以及使升级更容易,我想将其移动到另一个文件,然后require()该文件。

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

}

然后,从我的服务器文件:

var handler = require('handler')

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

不幸的是,此代码无法按预期工作

我的想法

我改变了参数并调整了几次代码,但我无法弄清楚出了什么问题。 看来Get()的值甚至在使用promise之前就被返回了(这很令人费解)。

任何帮助都会受到欢迎:)

2 个答案:

答案 0 :(得分:0)

我认为你应该是这样的:

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

然后

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

因此,请从Get返回承诺,然后使用其then API。

答案 1 :(得分:0)

以下是可能对您有所帮助的代码。

将主服务器文件更改为此类

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

在handler.js文件中,您可以执行

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