Нахождение подходящего оператора в RXJS для отображения / сокращения над внутренними записями наблюдаемой - PullRequest
0 голосов
/ 20 ноября 2018

Проблема: посмотрите на мои 3 console.log и изображение на выходе.Затем оператор tap не регистрирует каждую запись, потому что вывод предыдущей операции: mergeMap(getDataByUrl) вывод выглядит как Observable<entry[]>.Я думаю, что это могло бы работать, если бы каждая запись была наблюдаемой, как: Observable<Observable<entry>[]>.Я добавил оператор tap, где я делаю ожидаемое преобразование;тем не менее, он не работает по подписке, и мне было интересно, есть ли лучшие операторы.

Вопрос: Есть ли подходящий оператор для сопоставления / сокращения внутренних записей, возвращаемых этой mergeMap?Или как мне заставить мой subscribe вывести правильный вывод?

this.router$ = this.router.events.pipe(
  find(nextRoute),
  pluck('url'),
  mergeMap(getDataByUrl),
  tap(i => {
    console.log(i); // Wrong output (app.component.ts:52)
    const output = i.map(i => i[ 'data' ])
                    .reduce((acc, val) => {
                      acc[ val.id ] = val;
                      return acc;
                    }, {});
    console.log(output); // Proper output (app.component.ts:58)
    return output;
  }),
);
this.router$.subscribe(console.log); // Wrong output (Subscriber.js:196)

ВЫХОД:

enter image description here

1 Ответ

0 голосов
/ 21 ноября 2018

Rx предоставляет оператор reduce, вы можете с радостью заменить операцию tap на from и reduce, и она должна работать.То, что вы возвращаете из tap, не передается по цепочке, это оператор побочного эффекта, в основном используемый для отладки или изменения глобального значения.

this.router$ = this.router.events.pipe(
  find(nextRoute),
  pluck('url'),
  mergeMap(getDataByUrl),
  switchMap(i => from(i).pipe(map(i=>i.data))),
  reduce((acc, val) => {
                      acc[ val.id ] = val;
                      return acc;
                    }, {})
);
...