为什么forkJoin对观察者不起作用?

问题描述 投票:0回答:3

我尝试模拟服务器请求:

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加入结果。

angular rxjs angular5 angular8
3个回答
0
投票

因为forkJoin等待所有流完成,并且您的任何学科都没有这样做。

您可以改用combineLatest


0
投票

我的解决方法是:

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$上的应用程序中的任何位置订阅


0
投票

您可以在第一次发射后用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);

© www.soinside.com 2019 - 2024. All rights reserved.