2017-04-02 55 views
0

我有这个功能,会从我的数据库中的一些数据,但我有一个麻烦调用函数获得适当的响应快速的NodeJS异步问题

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

return x; 
}); 

和另一个函数调用该函数,但它始终返回undefined。 我如何使函数等到猫鼬完成填充数组?

感谢您的帮助! My life

+0

您需要使用回调策略来返回并解决猫鼬问题。 – Iceman

+0

@ JJ9如果您的问题得到解答,请将答案标记为已接受,不要让它保持打开状态 – orhankutlu

回答

0

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

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

您应该阅读猫鼬docs查询如何工作。

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

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

我会鼓励你去尝试的两种方法,即使用回调和使用的承诺。希望你觉得它有用!