有一個非常簡單的解釋。 function(err, result)
實質上是異步的,並且不會立即調用,而是在一段時間之後從mongo獲取數據。因此function(err, result)
是一個回調。所以,data
不會立即產生,但會過一段時間。現在,您立即返回數據,並且不要等待它被填充(在function(err, result)
回調中),因此undefined
顯然返回。
解決方案將使用JavaScript的Promises
,它允許您使用異步代碼和回調。當我們稱之爲getDataFromCollection
時,我們會返回一個Promise
,並鏈接一個.then
。當傳遞給resolve
函數的數據在getDataFromCollection
函數中解決承諾時,執行傳遞給then
的函數或回調。因此,當您收到result
時,將呼叫then
內的回叫。
所有的代碼 -
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
。
爲什麼不使用'return result'或'res.json(result)'(如果你使用express)? – Mikhail
我應該在其中寫回數結果 –
而不是'data = result'和'console.log(result)' – Mikhail