从BehaviorSubject创建的Angular 2 rxjs observable不能与forkJoin一起使用

时间:2016-10-20 22:35:22

标签: angular rxjs behaviorsubject

我正在尝试使用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.combineLatestforkJoin更适合我的需要...链接在这里,以防任何遇到此SO帖子: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-combineLatest

2 个答案:

答案 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);
});