外部函数调用,承诺,异步和Mongo - 混淆
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了外部函数调用,承诺,异步和Mongo - 混淆相关的知识,希望对你有一定的参考价值。
开始觉得这里真的很厚。阅读了很多,我相信我理解承诺和异步 - 等待得很好。但是,我似乎很难在其他地方使用该函数,这样我就可以获得结果(例如,我在另一个js文件中使用:let dbConnection = dbOperations.openDatabaseConnection();)。
有人可以向我解释为什么我会继续从下面的函数(使用promise和asyncawait写的相同函数)中等待?在函数返回之前,我可以按预期控制db.log的dbConnection结果。此外,我特别热衷于理解这种意义上的承诺,因为似乎许多npm软件包似乎都返回了promises(并且根据我的经验,至少async-await不能很好地解决这个问题? - >使用async不等待根据我的经验解决)。
//建立数据库连接
function openDatabaseConnection() {
let dbConnection = {};
return mongodb.connect(dbUri).then(conn => {
dbConnection.connection = conn;
return dbConnection;
})
.then(() => {
dbConnection.session = dbConnection.connection.db(dbName);
//console.log(dbConnection);
return dbConnection;
})
.catch(err => {
throw err;
});
};
//建立数据库连接
async function openDatabaseConnection() {
let dbConnection = {};
try {
dbConnection.connection = await mongodb.connect(dbUri);
dbConnection.session = await dbConnection.connection.db(dbName);
} finally {
//console.log(dbConnection);
return dbConnection;
};
};
答案
这两个函数再次返回一个承诺。
所以在你的陈述let dbConnection = dbOperations.openDatabaseConnection();
你指定一个承诺。
因此,您需要执行以下操作:
dbOperations.openDatabaseConnection().then((dbConn) => ..)
要么
let dbConnection = await dbOperations.openDatabaseConnection();
(注意这需要包装在async
函数中)
另一答案
Async / await只是与Promises一起工作的另一种方式,只是不要等待不是Promise的东西。
async function openDatabaseConnection() {
let dbConnection = {};
try {
dbConnection.connection = await mongodb.connect(dbUri);
// await here does not make sense, this function does not return a Promise
// dbConnection.session = await dbConnection.connection.db(dbName);
dbConnection.session = dbConnection.connection.db(dbName);
} finally {
//console.log(dbConnection);
// return will always execute, keep here only when it should
// return an empty object if the connection fails
return dbConnection;
};
};
以上是关于外部函数调用,承诺,异步和Mongo - 混淆的主要内容,如果未能解决你的问题,请参考以下文章