Область видимости функции forEach - как разобрать массив в функцию без повторных вызовов функции - PullRequest
1 голос
/ 14 марта 2019

У меня есть функция, которую я вызываю, и в рамках функции, которую я использую обещание, я также хочу сначала вызвать эту функцию (на самом деле это вторая функция, вызываемая в коде), извлечь некоторые данные, а затем проанализировать эти данные после того, как мойвторая функция, которая также вызывает некоторые данные.

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

Я вызываю forEach при первом вызове функции allEngagementTypes , так как мне нужно использовать каждый элемент, чтобы затем сделать мою вторую функциювызовите потенциальный доступ к событиям , затем я создаю массив с ответами с потенциалаEvents.push ,

Я хочу затем с этим массивом проанализировать его после моего третьего вызова ' allEngagementAreas 'как при вызове функции' addAreas ', я хочу проанализировать массив потенциальные события , но из-за forEach Он отправляется 21 раз, из которых только две области фактическиотправлено до полной загрузки addAreas, мне нужно отправить только один массив, чтобы он был проанализирован и был готов до allEngagementОбласти на самом деле называются.

Любая помощь очень ценится.

1 Ответ

0 голосов
/ 14 марта 2019

, если я правильно понял вашу проблему:

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

  }

Основная идея состоит в том, чтобы разделить его на два обещания и разрешить первое при заполнении массива.в циклах forEach они обычно сравнивают длину результата с некоторым константным значением.

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