NodeJS Express异步问题

时间:2017-04-02 21:24:33

标签: node.js mongodb express mongoose

我有这个函数可以从我的数据库中获取一些数据,但是我在调​​用函数并获得正确的响应方面遇到了麻烦

  function getEvents()
  {
    var x = [];
    var l = dbCollection['e'].find({}).forEach(function(y) {
    x.push(y);
  });

 return x;
});

和另一个调用此函数的函数但总是返回undefined。 如何让函数等到mongoose完成数组填充?

感谢您的帮助! My life

2 个答案:

答案 0 :(得分:0)

dbCollection['e'].find被称为非阻塞方式,因此您在填充前返回x。你需要使用回调或一些mongoose承诺。您可以从数据库中获取所有返回值,如以下代码段

function getEvents(callback) {
    dbCollection['e'].find({}, function(error, results) {
        // results is array.
        // if you need to filter results you can do it here
        return callback(error, results); 
    })
}

每当您需要调用getEvents函数时,您需要将回调传递给它。

getEvents(function(error, results) {
    console.log(results); // you have results here
})

您应该阅读mongoose docs以了解查询的工作原理。

猫鼬的承诺也有支持。您可以查看this url以获取有关承诺的更多信息。

答案 1 :(得分:0)

@orhankutlu提出的解决方案应该可以正常工作。

我将使用promise提供另一种解决方案。您可以根据自己的编程风格在这两种解决方案中选择一种。

使用承诺的解决方案:

function getEvents() {
    return new Promise(function(resolve, reject){
        dbCollection['e'].find({}, function(error, results) {
           if (error) return reject(error);

           var x = [];
           results.forEach(function(y){
              x.push(y);
           });
           // forEach() is a blocking call, 
           // so the promise will be resolved only 
           // after the forEach completes
           return resolve(x); 
        });
    });
};

调用getEvents():

getEvents().then(function(result){
    console.log(result);   //should print 'x'
}).catch(function(err){
    // Handle error here in case the promise is rejected
});

我会鼓励你尝试这两种方法,即使用回调和使用promises。希望你觉得它很有用!