外部函数调用,promise,异步和Mongo-感到困惑

时间:2018-11-22 16:09:45

标签: javascript mongodb promise async-await

在这里开始感觉真的很浓。读很多书,我相信我很好地理解了诺言和异步等待。但是,我似乎很难在其他地方使用该函数,以便获得结果(例如,我使用以下命令在另一个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;
    };
};

2 个答案:

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

More info on async/await