синхронные запросы к MongoDB - PullRequest
0 голосов
/ 08 мая 2018

есть ли способ сделать синхронные запросы к MongoDB?

Я хотел бы запустить некоторый код только после того, как я получил все свои данные из БД.

ВотОтрезанный образец.

Фрагмент кода A

const brandExists = Brands.find({name: trxn.name}).count();

Фрагмент кода B

if(brandExists == 0){
    Brands.insert({
                     name:trxn.name,
                     logo:"default.png", 
                 });
    Trxs.insert({
                   userId,
                   merchant_name,
                   amt,
               });
 }

Мне нужен кодфрагмент кода B, запускаемый только после того, как код фрагмента A завершил извлечение данных из базы данных.Как можно это сделать?

Ответы [ 3 ]

0 голосов
/ 08 мая 2018

Вы можете использовать простую async функцию async Функция всегда возвращает обещание.

const brandExists;
async function brandExist() {
  brandExists = Brands.find({
    name: trxn.name
  }).count();
}

brandExist().then(
  // Your Code comes here
  if (brandExists == 0) {
  Brands.insert({
    name: trxn.name,
    logo: "default.png",
  })
  Trxs.insert({
    userId,
    merchant_name,
    amt,
  });
});
0 голосов
/ 08 мая 2018

Я не думаю, что использование оператора if, подобного тому, которое у вас есть, имеет смысл: запросы отправляются друг за другом;возможно, кто-то еще создает бренд с тем же именем, с которым вы работаете, между вашими запросами к базе данных.

MongoDB имеет нечто под названием уникальные индексы , которые вы можете использовать для принудительного применения значенийбыть уникальнымВы должны быть в состоянии использовать name в качестве уникального индекса.Затем при вставке нового документа в коллекцию произойдет сбой, если документ с таким именем уже существует.

https://docs.mongodb.com/manual/core/index-unique/

0 голосов
/ 08 мая 2018

В Meteor запросы MongoDB являются синхронными, поэтому он уже обеспечивает то, что вам нужно.Нет необходимости вносить какие-либо изменения, фрагмент кода B будет запускаться только после кода фрагмента A.

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

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

Метеор основан на Узле , который по своей природе асинхронный, но кодирование только с асинхронными функциями может происходить из того, что разработчики называют " callback hell".

На стороне сервера Meteor решил использовать Fibers, что позволяет функциям ожидать результата, в результате чего получается код в синхронном стиле.

Там нетВолокна на стороне клиента, поэтому каждый раз, когда ваш клиент вызывает метод сервера, этот вызов будет асинхронным (вам придется беспокоиться о callbacks).

Ваш код является серверным кодом, и благодаря Fibers вы можете быть уверены, что код фрагмента B будет запускаться только после кода фрагмента A.

...