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

时间:2020-04-24 19:47:30

标签: angular rxjs angular5 angular8

我尝试模拟服务器请求:

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 个答案:

答案 0 :(得分:1)

因为forkJoin等到所有流都完成为止,而且您的主题都没有这样做。

您可以改用combineLatest

答案 1 :(得分: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$上的应用程序中的任何位置订阅

答案 2 :(得分: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);