没有办法使这种同步变得不可怕。正确的方法是
getAThing接受回调函数作为参数,然后
thing在可用时调用该函数。
function getAThing(callback){ var db = new mongo.Db("mydatabase", server, {}); db.open(function(err, db) { db.authenticate("myuser", "mypassword", function(err, success) { if (success) { db.collection("Things", function(err, collection) { collection.findOne({ name : "bob"}, function(err, thing) { db.close();callback(err, thing); }); }); } }); });}节点7.6+更新
async/
await现在提供了一种使用返回承诺的异步API(例如本机MongoDB驱动程序那样)时的同步
样式 编码方式。
使用这种方法,上面的方法可以写成:
async function getAThing() { let db = await mongodb.MongoClient.connect('mongodb://server/mydatabase'); if (await db.authenticate("myuser", "mypassword")) { let thing = await db.collection("Things").findOne({ name: "bob" }); await db.close(); return thing; }}然后您可以从另一个
async函数调用
let thing = await getAThing();。
但是,值得注意的是,它
MongoClient提供了一个连接池,因此您不应该在此方法中打开和关闭它。相反,请
MongoClient.connect在应用启动期间调用,然后将方法简化为:
async function getAThing() { return db.collection("Things").findOne({ name: "bob" });}请注意,我们不在
await方法中调用,而是直接返回由返回的promise
findOne。



