Node.js中的异步编程模型存在问题。
我知道以前曾经问过这个问题,但到目前为止我还没有找到任何可以用来解决问题的方法。
如何在调用console.log
并dbQueryName
从中获取其价值之前强制username
运行?
var MongoClient = require('mongodb').MongoClient;
var url = "mongodb://localhost:27017/";
function dbQueryName() {
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("users").findOne({}, function(err, result) {
if (err) throw err;
return result.name
db.close();
});
});
}
var username = dbQueryName();
// Wait until dbQueryName() has been invoked and username has gotten its value before running this
console.log(username);
我已经设法让它在函数中使用callback
参数工作,但有没有办法用更少的代码和缩进来做到这一点?
function dbQueryName(callback) {
MongoClient.connect(url, function(err, db) {
if (err) throw err;
var dbo = db.db("mydb");
dbo.collection("users").findOne({}, function(err, result) {
if (err) throw err;
callback(result.name)
db.close();
});
});
}
dbQuery(function(result){
var username = result
console.log(username);
});
答案 0 :(得分:1)
如果您没有将回调传递给MongoClient.connect或collection.findOne,则会返回一个承诺。
但是你需要添加另一个函数来使用async await
init()
async function dbQueryName() {
const db = await MongoClient.connect(url);
const dbo = db.db("mydb");
const user = await dbo.collection("users").findOne({})
return user.name
}
async function init() {
try {
const name = await dbQueryName()
} catch (error) {
console.log(error);
}
}