外部函数调用,承诺,异步和Mongo - 混淆

问题描述 投票:1回答:2

开始觉得这里真的很厚。阅读了很多,我相信我理解承诺和异步 - 等待得很好。但是,我似乎很难在其他地方使用该函数,这样我就可以获得结果(例如,我在另一个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;
    };
};
javascript mongodb promise async-await
2个回答
1
投票

这两个函数再次返回一个承诺。

所以在你的陈述let dbConnection = dbOperations.openDatabaseConnection();你指定一个承诺。

因此,您需要执行以下操作:

dbOperations.openDatabaseConnection().then((dbConn) => ..)

要么

let dbConnection = await dbOperations.openDatabaseConnection(); 

(注意这需要包装在async函数中)


0
投票

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;
  };
};

More info on async/await

© www.soinside.com 2019 - 2024. All rights reserved.