我尝试模拟服务器请求:
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加入结果。
因为forkJoin
等待所有流完成,并且您的任何学科都没有这样做。
您可以改用combineLatest
。
我的解决方法是:
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$
上的应用程序中的任何位置订阅
您可以在第一次发射后用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);