外部函数调用,承诺,异步和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;
  };
};

More info on async/await

以上是关于外部函数调用,承诺,异步和Mongo - 混淆的主要内容,如果未能解决你的问题,请参考以下文章

如何让 React Redux 异步操作返回一个承诺?

Jquery 承诺链

承诺等待得到解决而不返回

Jquery中的异步编程浅析 延期(deferred)的承诺(promise)

异步 redis 和承诺

使用外部 API 调用和 findOneAndUpdate 循环结果