【发布时间】:2019-03-06 22:50:52
【问题描述】:
我想向我的 MongoDB 服务器发出 Ajax 请求,并使用独立函数将数据与其他异步任务一起使用,这样我就可以尽可能地模块化我的代码。我对异步编程不是很有经验,所以我可能会犯一些基本错误。在我的代码中,我使用了另一个函数(doubleAfter2Seconds)返回一个承诺,它工作正常。 await getMongoData("mydb", url) 的结果变量以未定义的形式输出,而不是实际数据。
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://{MyServer}:27017/";
function getMongoData(dboArg, urlArg) {
var myPromise = () => {
return new Promise(resolve => {
MongoClient.connect(urlArg, { useNewUrlParser: true }, function(err, db) {
if (err) throw err;
var dbo = db.db(dboArg);
dbo.collection(myCollection).find({}).toArray(function(err, result) {
if (err) throw err;
console.log(result);
db.close();
resolve(result[0]);
});
})
})
}
}
function doubleAfter2Seconds(x) {
return new Promise(resolve => {
console.log("v");
setTimeout(() => {
resolve(x * 2);
}, 1000);
});
}
async function addAsync(x) {
// This works
const a = await doubleAfter2Seconds(10);
console.log(a);
// This doesn't work
result = await getMongoData("mydb", url);
console.log(result);
return x;
}
addAsync(10).then((sum) => {
console.log(sum);
});
【问题讨论】:
-
也许我错了,但你没有从你的
getMongoData函数返回任何东西。 -
var myPromise = () => {行应该做什么? -
永远不要在异步回调中使用
if (err) throw err;!您应该改为reject承诺。并且可能不会忘记关闭连接。 -
getMongoData() 返回如下: return new Promise(resolve => { ...
-
您将所有内容存储在
var myPromise = () => {....中,但从不返回函数之外的任何内容。
标签: javascript node.js mongodb promise async-await