Как вернуть данные из forkJoin как ненаблюдаемый кортеж? - PullRequest
0 голосов
/ 03 октября 2018

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

  public loadMatchAnalysis(clientId: string): void {    
    this.matchAnalysisService
      .getClientPolicySummary(clientId)
      .pipe(
        switchMap(clientPolicySummary => {
          const mappings$ = flatMap(clientPolicySummary.policyGroups, policyGroup => {
            return policyGroup.policies.map(policy => this.matchAnalysisService.getMappings(clientId, policy.id));
          });

          const calculations$ = flatMap(clientPolicySummary.policyGroups, policyGroup => {
            return policyGroup.policies.map(policy =>
              this.matchAnalysisService.getCalculationMethods(clientId, policy.id)
            );
          });

          return forkJoin(of(clientPolicySummary), ...mappings$, ...calculations$); //can't get this to return properly
        })
      )
      .subscribe(
        ([clientPolicySummary, mappings, calculations]: [
          ClientPolicySummary,
          MatchAnalysisMapping[],
          Calculation[]
        ]) => {
          let matchAnalysis: MatchAnalysis[] = [];

          console.log('mappings', mappings);
          console.log('calculations', calculations); //this will be what 'mappings' should be

          clientPolicySummary.policyGroups.forEach(policyGroup => {
            policyGroup.policies.forEach(policy => {
              const _mappings = mappings.filter(m => m.id === policy.id);
              const _calculations = calculations.filter(c => c.id === policy.id);

              matchAnalysis.push({ policy: policy, mappings: _mappings, children: _calculations });
            });
          });

          new GetMatchAnalysisLoadedAction({ data: matchAnalysis }).dispatch();
        },
        error => {

        }
      );
  }

На основании ввода моего forkJoin я пытаюсь вернуть данныев качестве кортежа для параметра в subscribe().Если я использую оператор распространения на mappings$ или calculations$, то возвращаемые данные будут в зависимости от того, что будет первым, кто использует оператор.Это заставляет меня думать, что я не должен использовать оператор распространения здесь - но я не уверен, что еще нужно сделать, чтобы вернуть данные и получить доступ к ним как к ненаблюдаемым данным.

Ответы [ 2 ]

0 голосов
/ 03 октября 2018

Уловка была в том, чтобы сделать:

return forkJoin(of(clientPolicySummary), forkJoin(...mappings$), forkJoin(...calculations$));

Потому что иначе ничто не собирает отображения и вычисления в их собственные массивы.

0 голосов
/ 03 октября 2018

forkJoin является оператором rxjs, все эти операторы обрабатывают асинхронные потоки данных.Таким образом, вы должны вернуть Observable, Observable является оберткой для асинхронных данных.

, так как для возврата кортежа весь кортеж должен быть наблюдаемым.Но switchmap оборачивает значение в новую наблюдаемую, поэтому не должно быть обязательным.

Вы можете вернуть это и ввести его как tuple

[clientPolicySummary, mappings$, calculations$]

или если выполучают ошибку типа, оберните ее в наблюдаемую

of([clientPolicySummary, mappings$, calculations$])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...