Angular 从 BehaviorSubject 创建的 2 个 rxjs observables 不能与 forkJoin 一起工作
Angular 2 rxjs observables created from BehaviorSubject are not working with forkJoin
我正在尝试使用 Observable.forkJoin
并且订阅处理程序从未受到影响。 forkJoin 运算符在我的应用程序的其他部分为我工作,在非工作场景中我能想到的唯一区别是可观察对象是使用其 asObservable()
函数从 BehaviorSubject
对象创建的。
此订阅获得成功
let obs = Observable.of(1);
Observable.forkJoin(
obs
).subscribe(data => {
console.log(data);
});
这个没有
let bs = new BehaviorSubject<number>(1);
let obs = bs.asObservable();
Observable.forkJoin(
obs
).subscribe(data => {
console.log(data);
});
当然在我的实际用例中有不止一个观察结果,这就是我首先使用 forkJoin 的原因。
是否需要对 BehaviorSubject 做一些其他事情才能使其与 forkJoin 一起工作?
更新:
在进一步研究 RxJs 文档后,我意识到 Observable.combineLatest
比 forkJoin
更适合我的需要... Link 以防万一遇到这个问题所以 post:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-combineLatest
问题是 forkJoin
在完成时加入 observables。
在您的第一个片段中,您正在使用 of
创建一个可观察对象 - 它在 subscribe
时立即发出一个值然后完成。
在您的第二个代码段中,BehaviorSubject
未完成。如果您要调用 complete
,您会看到记录到控制台的值:
let bs = new BehaviorSubject<number>(1);
let obs = bs.asObservable();
Observable.forkJoin(
obs
).subscribe(data => {
console.log(data);
});
bs.complete();
如果你不想使用完整的方法,你可以使用 take(1) 管道。
const subjectA = new BehaviorSubject<number>(0);
const a$ = subjectA.asObservable();
Observable.forkJoin(
a$.pipe(take(1))
).subscribe(data => {
console.log(data);
});
我正在尝试使用 Observable.forkJoin
并且订阅处理程序从未受到影响。 forkJoin 运算符在我的应用程序的其他部分为我工作,在非工作场景中我能想到的唯一区别是可观察对象是使用其 asObservable()
函数从 BehaviorSubject
对象创建的。
此订阅获得成功
let obs = Observable.of(1);
Observable.forkJoin(
obs
).subscribe(data => {
console.log(data);
});
这个没有
let bs = new BehaviorSubject<number>(1);
let obs = bs.asObservable();
Observable.forkJoin(
obs
).subscribe(data => {
console.log(data);
});
当然在我的实际用例中有不止一个观察结果,这就是我首先使用 forkJoin 的原因。
是否需要对 BehaviorSubject 做一些其他事情才能使其与 forkJoin 一起工作?
更新:
在进一步研究 RxJs 文档后,我意识到 Observable.combineLatest
比 forkJoin
更适合我的需要... Link 以防万一遇到这个问题所以 post:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-combineLatest
问题是 forkJoin
在完成时加入 observables。
在您的第一个片段中,您正在使用 of
创建一个可观察对象 - 它在 subscribe
时立即发出一个值然后完成。
在您的第二个代码段中,BehaviorSubject
未完成。如果您要调用 complete
,您会看到记录到控制台的值:
let bs = new BehaviorSubject<number>(1);
let obs = bs.asObservable();
Observable.forkJoin(
obs
).subscribe(data => {
console.log(data);
});
bs.complete();
如果你不想使用完整的方法,你可以使用 take(1) 管道。
const subjectA = new BehaviorSubject<number>(0);
const a$ = subjectA.asObservable();
Observable.forkJoin(
a$.pipe(take(1))
).subscribe(data => {
console.log(data);
});