ForkJoin 2 BehaviorSubjects

后端 未结 2 1930
隐瞒了意图╮
隐瞒了意图╮ 2020-12-20 13:24

I have two behaviour subject streams what I\'m trying to forkJoin with no luck. As I imagined it gives back the two last values of it. Is this possible to implement it someh

相关标签:
2条回答
  • 2020-12-20 13:40

    If you don't want (or don't know when) to call complete(), you may use combineLatest instead of forkJoin.

    With combineLatest, anytime one of the source observables (in your case your behavior subjects) emits a value, combineLatest will trigger:

    let stream1 = new BehaviorSubject(2);
    let stream2 = new BehaviorSubject('two');
    
    combineLatest(stream1, stream2)
        .subscribe(r => {
             console.log(r);
        });
    
    stream1.next(3);
    stream2.next('three');
    

    Console log:

    (2) [2, "two"] // initial state

    (2) [3, "two"] // next triggered on stream1

    (2) [3, "three"] // next triggered on stream2

    Live demo: https://stackblitz.com/edit/rxjs-qzxo3n

    0 讨论(0)
  • 2020-12-20 13:53

    Note what forkJoin() actually does from its documentation:

    Wait for Observables to complete and then combine last values they emitted.

    This means that forkJoin() emits a value when all input Observable are complete. When using BehaviorSubject this means explicitly calling complete() on both of them:

    import { Observable, BehaviorSubject, forkJoin } from 'rxjs';
    
    const stream1 = new BehaviorSubject(2);
    const stream2 = new BehaviorSubject('two');
    
    forkJoin(stream1, stream2)
      .subscribe(r => {
        console.log(r);
      });
    
    stream1.complete();
    stream2.complete();
    

    See live demo: https://stackblitz.com/edit/rxjs-9nqtx6

    March 2019: Updated for RxJS 6.

    0 讨论(0)
提交回复
热议问题