Как обойти проблему async/await

Я создаю простой скрипт узла, чтобы изучить функциональность Cosmos DB. Я хочу создать способ, чтобы не предоставлять следующее в верхней части каждой асинхронной функции (да, я знаю, что могу связать асинхронные вызовы с помощью, но это все равно означает, что я должен использовать новый экземпляр БД в верхней части каждой Итак, я хочу сделать что-то вроде этого:

const {database} = await client.databases.createIfNotExists({id: databaseId});
const {container} = await database.containers.createIfNotExists({id: containerId});

С учетом сказанного, я несколько часов ломал голову над этим и не могу найти способ создать одну базу данных и один контейнер для всех моих функций. Идея (но не реализация, потому что она не работает) состоит в том, чтобы сделать что-то вроде этого:

getConnections = async () => {

    const {database} = await client.databases.createIfNotExists({id: databaseId});
    const {container} = await database.containers.createIfNotExists({id: containerId});

    let connections = {};
     connections.db = database;
     connections.container = container;

    return connections;
};

Но поскольку метод getCoonections является асинхронным (а он должен быть асинхронным, поскольку методы, которые его используют, тоже), функция не обязательно завершится до того, как будет сделана первая вставка в другую функцию, тем самым вызывая исключение.

Кто-нибудь нашел способ централизовать эти объекты, чтобы мне не приходилось объявлять их в каждой асинхронной функции моего приложения?


person David Starr - Elegant Code    schedule 23.10.2018    source источник
comment
Что именно означает каждая асинхронная функция моего приложения? Используют ли все ваши функции эти два объекта? Как называются все функции? Организованы ли они в методах экземпляров или что-то в этом роде? И есть ли в вашем приложении какая-то main функция или точка входа?   -  person Bergi    schedule 23.10.2018
comment
См. также этот ответ для общего подхода.   -  person Bergi    schedule 23.10.2018


Ответы (2)


Похоже, вам нужно получить эти соединения, прежде чем приложение сделает что-нибудь еще. Так почему бы просто не сделать так, чтобы загрузка вашего приложения тоже использовала async/await?

async function init() {
  const connections = await getConnections();
  const app = initializeTheRestOfYourApp(connections); // now safe to do inserts
};
init();
person Alex Wayne    schedule 23.10.2018

Теперь это в значительной степени работает. Не знаю, почему, поскольку между этим init() и следующим асинхронным методом в цепочке вызовов нет блокировки, но это работает. – Дэвид Старр – Elegant Code только что

person David Starr - Elegant Code    schedule 28.10.2018