вызов внешней функции, обещание, асинхронность и монго - запутано - PullRequest
0 голосов
/ 22 ноября 2018

Начинаю чувствовать себя действительно толстым здесь.Много читаю, и я верю, что понимаю обещания и хорошо прислушиваюсь.Тем не менее, я, кажется, изо всех сил пытаюсь использовать функцию в другом месте, так что я могу получить результат (например, я ожидаю в другом файле js с: let dbConnection = dbOperations.openDatabaseConnection ();).

Может кто-то объяснитьдля меня, почему я продолжаю получать ожидания от следующих функций (та же функция, написанная с Promise и Asyncawait)?Я могу console.log получить результат dbConnection, как и ожидалось до моего возвращения в функцию.Кроме того, я особенно заинтересован в понимании обещаний в этом смысле, так как кажется, что многие пакеты npm, похоже, возвращают обещания (и с моим опытом, по крайней мере, 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 голосов
/ 22 ноября 2018

Асинхронизация / ожидание - это еще один способ работы с Обещаниями, просто не ждите чего-то, что не является обещанием.

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

Подробнее об асинхронизации / ожидание

0 голосов
/ 22 ноября 2018

Обе функции снова возвращают обещание.

Итак, в своем заявлении let dbConnection = dbOperations.openDatabaseConnection(); вы назначаете обещание.

Таким образом, вам нужно сделать что-то вроде:

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

или

let dbConnection = await dbOperations.openDatabaseConnection(); 

(обратите внимание, что это необходимо заключить в функцию async)

...