20

我正在尝试使用Observable.forkJoin并且订阅处理程序永远不会受到打击。forkJoin 运算符在我的应用程序的其他部分为我工作,在非工作场景中我能想到的唯一区别是 observables 是使用它的函数 从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

4

2 回答 2

17

问题是forkJoin当它们完成时加入可观察对象。

of在您的第一个片段中,您正在使用-创建一个可观察的对象,它subscribe会立即发出一个值,然后完成。

在您的第二个片段中,BehaviorSubject没有完成。如果您要调用complete,您会看到记录到控制台的值:

let bs = new BehaviorSubject<number>(1);
let obs = bs.asObservable();

Observable.forkJoin(
    obs
).subscribe(data => {
    console.log(data);
});

bs.complete();
于 2016-10-21T00:19:55.460 回答
0

如果您不想使用完整方法,可以使用 take(1) 管道。

const subjectA = new BehaviorSubject<number>(0);
const a$ = subjectA.asObservable();

Observable.forkJoin(
    a$.pipe(take(1))
).subscribe(data => {
    console.log(data);
});
于 2021-05-13T10:20:03.050 回答