forEach函数作用域-如何在不重复函数调用的情况下将数组解析为函数

时间:2019-03-14 08:42:09

标签: javascript promise

我有一个要调用的函数,在该函数中我使用了Promise,我也想先调用此函数(实际上是代码中调用的第二个函数),检索一些数据,然后解析该数据。第二个函数也可以检索一些数据。

      getAllProductGroups(): Promise<void> {
    return new Promise((resolve, reject) => {
      this.allEngagementTypes().subscribe(data => {
        const products = {};
        const potentialEvents = [];
        data.forEach(product => {
          // products[product.id] = product.description;
          this.potentialForEvents(this.organization.id, product.id)
          .subscribe(potentialEventData => {

            potentialEvents.push(potentialEventData);

            this.allEngagementAreas().subscribe(areas => {

              this.organization.addAreas(areas, potentialEvents);
              resolve();
            }, error => reject(error));
          });
        });   
      })
    });
  }

我在第一个函数调用 allEngagementTypes 上调用forEach,因为我需要使用每个元素然后在 potentialForEvents 上进行第二个函数调用,然后创建一个数组带有 potentialEvents.push

的响应

然后我要使用该数组,在我的第三个调用“ allEngagementAreas ”之后对其进行解析,因为当此函数调用“ addAreas”函数时,我要解析该数组 potentialEvents ,但是由于forEach已发送21次,因此在“ addAreas”完全加载之前实际上仅发送了其中两个区域,因此我只需要发送一个数组并对其进行解析即可在 allEngagementAreas 。

非常感谢您的帮助。

1 个答案:

答案 0 :(得分:0)

如果我正确理解了您的问题:

getAllProductGroups(): Promise<void> {
    return new Promise((resolve, reject) => {
      this.allEngagementTypes().subscribe(data => {
        const products = {};
        const potentialEvents = [];
        data.forEach(product => {
          // products[product.id] = product.description;
          this.potentialForEvents(this.organization.id, product.id)
          .subscribe(potentialEventData => {
            potentialEvents.push(potentialEventData);
            if(potentialEvents.length === someConstValue) { //not sure how, but you need to find out the needed array length
                resolve(potentialEvents);
            }
          });
        });   
      })
    }).then(potentialEvents => {
        this.allEngagementAreas().subscribe(areas => {
            this.organization.addAreas(areas, potentialEvents);
        }, error => reject(error));
    })

  }

主要思想是将其拆分为两个Promise,并在填充数组时解析第一个Promise。在forEach循环中,它们通常将结果长度与某个const值进行比较。