Как составить таблицу / агрегировать итоговое значение из массива наблюдаемых с помощью метода Reduce / Scan (в NGRX / NGXS) - PullRequest
0 голосов
/ 26 апреля 2020

Я пытаюсь агрегировать / табулировать результаты набора наблюдаемых. У меня есть массив наблюдаемых, каждый из которых возвращает число, и я хочу суммировать эти результаты и выдать их в качестве значения. Каждый раз, когда меняются исходные числа, я хочу, чтобы конечный результат отражал новый итог. Проблема в том, что я получаю предыдущие результаты, добавленные к новому итогу. Это связано с тем, как я использую оператор уменьшения / сканирования. Я считаю, что он должен быть вложен в switchMap / mergeMap, но до сих пор я не смог найти решение.

Я смоделировал простой пример. Показывает, сколько автомобилей принадлежит всем пользователям. Изначально счет правильный, но когда вы добавляете автомобиль пользователю, новый итог включает предыдущий итог.

https://stackblitz.com/edit/rxjs-concat-observables-3-drfd36

Любая помощь приветствуется.

Ответы [ 2 ]

0 голосов
/ 27 апреля 2020

Я закончил тем, что сделал это:

this.carCount$ = this.users$.pipe(
  map((users: User[]): Array<Observable<number>> => {
    let requests = users.map(
      (user: User): Observable<number> => {
        return this.store.select(UserSelectors.getCarsForUser(user)).pipe(
          map((cars: Car[]): number => {
            return cars.length;
          })
        );
      }
    );
    return requests;
  }),
  flatMap((results): Observable<number> => {
    return combineLatest(results).pipe(
      take(1),
      flatMap(data => data),
      reduce((accum: number, result: number): number => {
        return accum + result;
      }, 0)
    )
  })
);

Я думаю, что take (1) заканчивает тем же, что делал Яссер выше, воссоздавая весь поток. Я думаю, что этот способ немного чище.

Я также добавил еще один поток под ним (в коде), который на один уровень глубже с точки зрения извлечения наблюдаемых наблюдаемых. https://stackblitz.com/edit/rxjs-concat-observables-working-1

У кого-нибудь есть более чистый и лучший способ сделать этот тип свертывания наблюдаемых результатов?

0 голосов
/ 26 апреля 2020

Ваш scan работает отлично, дело в том, что для каждого обновления поток получает все данные многократно, поэтому, я думаю, самый быстрый способ исправить это установить новый экземпляр потока в handleClickAddCar.

https://stackblitz.com/edit/rxjs-wrong-count.

...