【问题标题】:Angular 2 rxjs observables created from BehaviorSubject are not working with forkJoin从 BehaviorSubject 创建的 Angular 2 rxjs observables 不适用于 forkJoin
【发布时间】:2016-10-20 22:35:21
【问题描述】:

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

当然,在我的实际用例中,有不止一个 observable,这就是我首先使用 forkJoin 的原因。

是否需要对 BehaviorSubject 进行其他操作才能使其与 forkJoin 一起使用?

更新:

在对 RxJs 文档进行了更多调查后,我意识到 Observable.combineLatestforkJoin 更适合我的需要...如果遇到此 SO 帖子,请点击此处链接: http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html#static-method-combineLatest

【问题讨论】:

    标签: angular rxjs behaviorsubject


    【解决方案1】:

    问题是forkJoin 在完成时加入了 observables。

    在您的第一个 sn-p 中,您正在使用 of 创建一个 observable - 在 subscribe 上,它立即发出一个值然后完成。

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

    let bs = new BehaviorSubject<number>(1);
    let obs = bs.asObservable();
    
    Observable.forkJoin(
        obs
    ).subscribe(data => {
        console.log(data);
    });
    
    bs.complete();
    

    【讨论】:

    • 感谢您的回复。在对 RxJs 文档进行了更多调查后,我意识到Observable.combineLatestforkJoin 更适合我的需要...如果遇到此 SO 帖子,请点击此处链接:reactivex.io/rxjs/class/es6/…
    【解决方案2】:

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

    const subjectA = new BehaviorSubject<number>(0);
    const a$ = subjectA.asObservable();
    
    Observable.forkJoin(
        a$.pipe(take(1))
    ).subscribe(data => {
        console.log(data);
    });
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-03-10
      • 1970-01-01
      • 1970-01-01
      • 2017-03-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      相关资源
      最近更新 更多