我需要制作这样的函数。
function getDataFromCollection(collectionName) {
let data;
MongoClient.connect(url, function(err, db) {
if (err) throw err;
db.collection(collectionName).find({}).toArray(function(err, result) {
data = result;
console.log(result);
db.close();
});
});
return data;
}
问题是数据未定义,但是当我执行console.log(result)时,它可以工作。有任何想法可以帮助我。提前谢谢。
答案 0 :(得分:2)
这是一个非常简单的解释。 function(err, result)
本质上是异步的,不会立即调用,但是在从mongo获取数据的一段时间之后。因此function(err, result)
是一个回调。因此,data
不会立即生效,但过了一会儿。现在,您立即返回数据并且不要等待它填充(在function(err, result)
回调内),因此显然会返回undefined
。
解决方案是使用JavaScript Promises
,它允许您使用异步代码和回调。当我们调用它时,我们会从Promise
返回getDataFromCollection
并链接.then
。当使用传递给then
函数的数据在getDataFromCollection
函数内解析promise时,将执行传递给resolve
的函数或回调。因此,当您收到then
时,将调用result
内的回调。
所有代码 -
function getDataFromCollection(collectionName) {
return new Promise(function(resolve, reject) {
MongoClient.connect(url, function(err, db) {
if (err) {
reject(err);
return;
}
db.collection(collectionName).find({}).toArray(function(err, result) {
if (err) {
reject(err);
return;
}
console.log(result);
db.close();
resolve(result);
});
});
});
}
按照这样的方式消费。
getDataFromCollection("collection")
.then(function(result) {
// use result
})
.catch(function(err) {
console.log(err);
});
从here了解Promises
。