当前位置: 首页 > 知识库问答 >
问题:

如何等待一个forEach完成后才能从我的promise/功能中返回

蒲德曜
2023-03-14

角形,防火库

 const products = await this.billingService.getProducts();
async getProducts() {
    let result = [];
    let product = {};
    return this.db.collection(
      'products',
      ref => { ref
        let query: Query = ref;
          return query.where('active', '==', true)
      })
      .ref
      .get()
      .then(function (querySnapshot) {
        querySnapshot.forEach(async function (doc) {
          product = doc.data();
          product['prices'] = [];

          await doc.ref
            .collection('prices')
            .orderBy('unit_amount')
            .get()
            .then(function (docs) {
              // Prices dropdown
              docs.forEach(function (doc) {
                const priceId = doc.id;
                const priceData = doc.data();
                product['prices'].push(priceData);
              });
            });
        });
        result.push(product);
        return result;
      });
  }
await this.billingService.getProducts().then(results =>
getProducts() {
      const dbRef =
        this.db.collection(
          'products',
          ref => { ref
            let query: Query = ref; return query.where('active', '==', true)
        });
       const dbPromise = dbRef.ref.get();

      return dbPromise
        .then(function(querySnapshot) {
          let results = [];
          let product = {};
          querySnapshot.forEach(function(doc) {
            let docRef = doc.ref
              .collection('prices')
              .orderBy('unit_amount')
              results.push(docRef.get())
          });
          return Promise.all(results)
        })
        .catch(function(error) {
            console.log("Error getting documents: ", error);
        });
    } 

共有1个答案

岳君之
2023-03-14

在评论中发布社区维基答案。

对于这种情况,使用foreach()不是正确的选择。正如本例中所阐明的,foreach()不能正确地处理await函数,这样,就不能正确地处理您的promise。考虑到这一点以及您希望按顺序读取数据的事实--因为一个查询的结果会影响第二个查询--您需要使用一个普通的for,以循环遍历数据和数组。这里的具体答案应该有助于您使用代码示例。

 类似资料:
  • 我使用的是Firebase Cloud Firestore,然而,我认为这可能更像是JavaScript异步与同步promise返回的问题。 我正在执行一个查询以从一个集合中获取ID,然后循环该查询的结果以根据该ID从另一个集合中查找单个记录。 我怎么能等到forEach完成后才从外部promise和外部函数本身返回呢?

  • 问题内容: 我有以下 我有一个运行一些ajax的函数,然后根据ajax是否成功返回true或false。我从代码的多个位置调用了这个ajax函数。 因为该函数在ajax完成之前结束,所以它总是返回false。如何避免这种情况? 我读到一些建议我在函数中执行的操作,然后将和函数移至我的和函数。但是,在我的方法中,我进行了大量的计算。很多代码。因此,问题在于,如果我将功能移至其他功能,那么我将复制一堆

  • 我仍在为承诺而挣扎,但多亏了这里的社区,我取得了一些进步。 我有一个简单的JS函数,它查询解析数据库。它应该返回结果数组,但显然由于查询的异步性质(因此有承诺),函数在结果之前返回,给我留下一个未定义的数组。 我需要做什么才能让这个函数等待承诺的结果呢? 这是我的代码:

  • 我和Nodejs一起工作。我有一个异步,因为我必须等待内部的结果。因此,我需要等待foreach完成,然后继续循环的结果。我找到了几个等待的解决方案,其中一个是使用promise。虽然我这样做了,这些promise是创建的,但是,代码后的每个(因此promise)完成,从来没有实际执行(console.log没有打印)。NodeJS函数结束时没有任何错误。 这是我的密码: “here”只打印一次(

  • 问题内容: 我有以下JavaScript代码: 我如何确保仅在完成后调用? 问题答案: 指定一个匿名回调,并使function1接受它:

  • 问题内容: 我在正常( 非ajax )函数中遇到了问题,每个函数中都包含许多 动画 。目前,我只是具有一个between函数,但这并不是完美的,因为没有浏览器/计算机是相同的。 附加说明:它们都有碰撞的单独动画/等。 我不能简单地将一个放在另一个的回调函数中 无论如何在js / jQuery中有: 我知道&,但是这些是针对AJAX的… 我更新的解决方案 jQuery有一个名为$ .timers的暴