Почему forkJoin не работает для наблюдателей? - PullRequest
0 голосов
/ 24 апреля 2020

Я попытался эмулировать запросы сервера:

const _blocks$ = new BehaviorSubject<any[]>([]);
const _fields$ = new BehaviorSubject<any[]>([]);

Затем я запускаю двух наблюдателей:

 of(true)
      .pipe(delay(1000))
      .subscribe(() => {
        _blocks$.next(["blocks"]);
      });

    of(false)
      .pipe(delay(5000))
      .subscribe(() => {
        _fields$.next(["fields"]);
      });

Где-то в приложении я пытаюсь прослушать и присоединиться к наблюдателям:

forkJoin(_blocks$, _fields$).subscribe(
  (data) => {
    console.log(data);
  }
);

Почему я не получаю console.log(data); после выполнения?

Моя проблема заключается в том, чтобы прослушивать все запросы к серверу, и когда они завершаются, результат присоединения выполняется с помощью forkJoin.

Ответы [ 3 ]

1 голос
/ 24 апреля 2020

Потому что forkJoin ожидает завершения всех потоков, и ни один из ваших подданных не делает этого.

Вместо этого вы можете использовать combineLatest.

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

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

const _blocks$ = new BehaviorSubject<any[]>([]);
const _fields$ = new BehaviorSubject<any[]>([]);

const blocks$ = this._blocks$.asObservable().pipe(take(1));
const fields$ = this._fields$.asObservable().pipe(take(1));

forkJoin(blocks$, fields$).subscribe(console.log);

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

Мое решение:

let _blocks$ = new Observable<number>();
let _fields$ = new Observable<number>();

   _blocks$ = of(1).pipe(delay(1000));
    _fields$ = of(2).pipe(delay(5000));

    _blocks$.subscribe(() => {
      console.log("blocks");
    });

    _fields$.subscribe(() => {
      console.log("fields");
    });

    forkJoin(_blocks$, _fields$).subscribe(
      (data) => {
        console.log(data);
      }
    );

Потребители могут подписаться в любом месте приложения на _blocks$ и _fields$

...