Подождите, пока обратный вызов запустится, прежде чем выбросить результат в firestore - PullRequest
0 голосов
/ 07 декабря 2018

Я пользуюсь реагирующим, экспо и пожарным магазином. У меня есть столы

продукты

  • id
  • имя

предметы

  • id
  • productId
  • expirationDate

Я хочу получить всепродукты и количество предметов, которые продукт имеет.Код:

export const getProducts = (callback) => {
  const db = firebase.firestore();

  let products = [];

  db.collection('products').get().then((productsSnapshot) => {
    productsSnapshot.forEach((_product, index, array) => {
    let product = _product.data()

    product.id = _product.id;
    getItems(product._id, (items, error) => {
      product.count = items.length;
      products.push(product);
    });
  });
  callback(products, null);
  ...

export const getItems = (productId, callback) => {
  const db = firebase.firestore();
  let items = [];

  db.collection('items').where('productId', '==', productId).get()
  .then((itemsSnapshot) => {
    itemsSnapshot.forEach((_item) => {
      let item = _item.data();
      item.id = _item.id;

      items.push(item);
    });

    callback(items, null);
    ...

У меня проблема в том, что обратный вызов на getItems запускается после, и .count никогда не получает значение.

Я пробовал async await, но я не мог понять, как его использовать, и выдавал ошибки при использовании firestore.Является ли использование обратных вызовов плохой идеей?Как это должно быть сделано?

1 Ответ

0 голосов
/ 07 декабря 2018

Вы могли бы окружить его обещанием и поместить обратный вызов в тогда.Как то так ...

new Promise((resolve, reject) => {
    db.collection('products').get().then((productsSnapshot) => {
        productsSnapshot.forEach((_product, index, array) => {
            let product = _product.data()
            product.id = _product.id;
            getItems(product._id, (items, error) => {
                product.count = items.length;
                products.push(product);
            });
        });
        resolve();
    });
}).then(function () {
    callback(products, null);
});
...