Обработка данных в NgRx Effect с помощью другого вызова API через канал - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь обработать данные, возвращенные после первого вызова API, используя эффекты NgRx.

  fetchPages$ = createEffect(() =>
    this._actions$.pipe(
      ofType(FETCH_PAGES),
      switchMap(() => this._confApi.getPages()
        .pipe(
          map(pages => {
            pages.forEach(page => {
              this._confApi.getPageVersion(page.url).pipe(map(version => page.version = version));
            });
            return pages;
          }),
          map(pages => SAVE_PAGES({pages}))
        )
      )
    )
  );

Но в этом случае вызов API на первой карте даже не вызывается. Я также попробовал этот способ:

  fetchPages$ = createEffect(() =>
    this._actions$.pipe(
      ofType(FETCH_PAGES),
      switchMap(() => this._confApi.getPages()
        .pipe(
          map(pages => {
            pages.forEach(page => {
              this._confApi.getPageVersion(page.url).subscribe(version => page.version = version);
            });
            return pages;
          }),
          map(pages => SAVE_PAGES({pages}))
        )
      )
    )
  );

И пока он выполняет вызов, значение не добавляется в свойство страницы (сопоставление с SAVE_PAGES фактически не ожидает).

Что такоеправильный способ решения этой проблемы?

1 Ответ

1 голос
/ 05 ноября 2019

Вам не хватает forkJoin, чтобы дождаться завершения всех наблюдаемых getPageVersion.

Вы хотите, вероятно, что-то подобное

  fetchPages$ = createEffect(() =>
    this._actions$.pipe(
      ofType(FETCH_PAGES),
      switchMap(() => this._confApi.getPages()),
      switchMap(pages => {
        return forkJoin(pages.map(page => this._confApi.getPageVersion(page.url).pipe(
          map(version => ({ ...page, version }))
        )));
      }),
      map(pages => SAVE_PAGES({ pages }))
    )
  );
...