我正在尝试使用Observable.forkJoin
,订阅处理程序永远不会被命中。 forkJoin运算符在我的app的其他部分为我工作,我在非工作场景中可以想到的唯一区别是observable是使用BehaviorSubject
函数从asObservable()
个对象创建的。
此订阅被点击
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);
});
当然,在我的实际用例中,有一个以上的obseravble,这就是为什么我首先使用forkJoin。
还有什么需要对BehaviorSubject做才能使它与forkJoin一起工作吗?
更新:
在对RxJs文档进行更多调查后,我意识到Observable.combineLatest
比forkJoin
更适合我的需要...链接在这里,以防任何遇到此SO帖子:
http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-combineLatest
答案 0 :(得分:13)
问题是forkJoin
在完成后加入了观察者。
在您的第一个代码段中,您正在使用of
创建一个observable - 在subscribe
后,会立即发出一个值,然后完成。
在您的第二个代码段中,BehaviorSubject
未完成。如果您要拨打complete
,您会看到记录到控制台的值:
let bs = new BehaviorSubject<number>(1);
let obs = bs.asObservable();
Observable.forkJoin(
obs
).subscribe(data => {
console.log(data);
});
bs.complete();
答案 1 :(得分:0)
如果你不想使用完整的方法,你可以使用 take(1) 管道。
const subjectA = new BehaviorSubject<number>(0);
const a$ = subjectA.asObservable();
Observable.forkJoin(
a$.pipe(take(1))
).subscribe(data => {
console.log(data);
});