在这里开始感觉真的很浓。读很多书,我相信我很好地理解了诺言和异步等待。但是,我似乎很难在其他地方使用该函数,以便获得结果(例如,我使用以下命令在另一个js文件中挂起:let dbConnection = dbOperations.openDatabaseConnection();)。
有人可以向我解释为什么我为什么要继续使用以下功能(用promise和asyncawait编写的相同功能)待处理吗?我可以在返回函数之前按预期方式console.log dbConnection结果。另外,我特别热衷于从这种意义上理解promise,因为似乎许多npm软件包似乎都返回promise(根据我的经验,至少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;
};
};
答案 0 :(得分:1)
两个函数都再次返回一个承诺。
因此,在您的声明let dbConnection = dbOperations.openDatabaseConnection();
中
您分配一个诺言。
因此,您需要执行以下操作:
dbOperations.openDatabaseConnection().then((dbConn) => ..)
或
let dbConnection = await dbOperations.openDatabaseConnection();
(请注意,这需要包装在async
函数中)
答案 1 :(得分:0)
异步/等待只是使用Promise的另一种方式,只是不要等待那些不是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;
};
};