rxjs forkJoin - вложенная наблюдаемая внутри другой наблюдаемой - PullRequest
1 голос
/ 11 декабря 2019

Существует два набора наблюдаемых (сетевых запросов). После разрешения первой наблюдаемой мне нужно forkJoin несколько наблюдаемых. Но взамен вместо данных я получаю Subscriber.

Пожалуйста, проверьте тидь скрипку https://stackblitz.com/edit/zj3mhp?file=index.ts

import { forkJoin, of, timer } from "rxjs";
import { map } from "rxjs/operators";

let array = [of({ data: [1] }), of({ data: [2] })];
const init = of({ pages: 2 });

function gerData() {
  const observable = forkJoin(array);
  return init.pipe(
    map(data => {
      return observable.subscribe(data => {
        const arr = [];
        data.forEach(x => {
          arr.push(...x.data);
        });
        console.log('array', arr);
        return arr;
      });
    })
  );
}



gerData().subscribe((data) => {
  console.log('final data: ', data);
})

Ответы [ 3 ]

2 голосов
/ 11 декабря 2019

Вы можете использовать mergeMap() вместо map (), возвращение подписки не поможет.

Независимо от того, что мы вернем в map(), это будет значение, полученное при успешном обратном вызовеподписка. Мы не можем получить значения из объекта подписки.

В mergeMap мы возвращаем Observable, который будет объединен с родительской наблюдаемой, и мы можем получить значение объединенной наблюдаемой, используя одну подписку.

import { forkJoin, of, timer } from "rxjs";
import { map, mergeMap } from "rxjs/operators";

let array = [of({ data: [1] }), of({ data: [2] })];
const init = of({ pages: 2 });

function gerData() {
  const observable = forkJoin(array);
  return init.pipe(
    mergeMap(data => {
      return observable.pipe(map(data => {
        const arr = [];
        data.forEach(x => {
          arr.push(...x.data);
        });
        console.log('array', arr);
        return arr;
      }));
    })
  );
}



gerData().subscribe((data) => {
  console.log('final data: ', data);
})

https://stackblitz.com/edit/zj3mhp-elrkur?file=index.ts

1 голос
/ 11 декабря 2019

Вы могли бы сделать что-то вроде

function gerData() {
  const observable = forkJoin(array);
  return init.pipe(
    switchMap(() => observable),
    map(res => res.reduce((prev, next) => prev.concat(next.data), []))
  );
}

gerData().subscribe(data => {
  console.log("final data: ", data);
});
0 голосов
/ 11 декабря 2019

Как только вы подписываетесь на observable, он начинает выполняться и превращается в subscription, вы должны вернуть observable и использовать switchMap для запуска этой наблюдаемой. Пожалуйста, попробуйте следующее:

function gerData() {
  return init.pipe(switchMap(data=>
    forkJoin(array).pipe(map(arr=>arr.map(item=>item.data)))
  ));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...