Как дождаться завершения функции mongoose .exec () перед возвратом? - PullRequest
0 голосов
/ 09 ноября 2019

У меня есть следующая функция с использованием mongoose:

  let username = userObject.username;
  Purchase.find({
    account: username,
    fufilled: true 
  })
    .populate("keys")
    .exec(function(err, foundPurchases) {
      if (err) {
        return inStockItems;
      } else {
        if (foundPurchases.length === 0) {
          return inStockItems;
        } else {
          // these lists will be a list of IDs of game detail entries in the database
          let listOfReceivedIds = foundPurchases.keys.map(obj => obj.game);

          for (let i = 0; i < inStockItems.length; i++) {
            if (inStockItems.length <= minimum) {
              return inStockItems;
            }

            let currentProductAnalysing = inStockItems[i];
            if (listOfReceivedIds.includes(currentProductAnalysing._id)) {
              console.log("removing product");
              inStockItems.splice(i, 1);
            }
          }
          return inStockItems;
        }
      }
    });

Я запускаю функцию, подобную следующей, которая возвращает undefined

inStockItems = function_name(inStockItems, userObject, amount);

Как я могу переписать функцию такчто функция возвращает значение inStockItems, а не undefined. Благодаря.

1 Ответ

0 голосов
/ 10 ноября 2019

.exec в Mongoose возвращает обещание результата запроса, если вы не ответили на него. Ваша функция должна вызывать .exec() и изменять ее возвращаемое значение, чтобы оно возвращало что-то отличное от функции, подобной этой:

async function function_name(inStockItems, userObject, amount) {
  const foundPurchases = await Purchase.find({
      account: username,
      fufilled: true
    })
    .populate("keys")
    .exec();
  if (foundPurchases.length === 0) {
    return inStockItems;
  } else {
    let listOfReceivedIds = foundPurchases.keys.map(obj => obj.game);

    for (let i = 0; i < inStockItems.length; i++) {
      if (inStockItems.length <= minimum) {
        return inStockItems;
      }

      let currentProductAnalysing = inStockItems[i];
      if (listOfReceivedIds.includes(currentProductAnalysing._id)) {
        console.log("removing product");
        inStockItems.splice(i, 1);
      }
    }
    return inStockItems;
  }
}

Другой альтернативой будет передача параметра обратного вызова в вашу функцию и вызов егоиз exec() обратного вызова, но обещания, как правило, более понятны для работы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...