等待回调运行后再抛出结果

时间:2018-12-07 00:55:38

标签: firebase react-native google-cloud-firestore expo

我使用React-native,Expo和Firebase Firestore 我有桌子

产品

  • 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从未获得值。

我尝试了异步等待,但是我不明白如何使用它,并且在使用Firestore时抛出了错误。使用回调是个坏主意吗?应该怎么做?

1 个答案:

答案 0 :(得分:1)

您可以在其周围加上一个Promise,然后在其中放置回调。像这样...

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