代码之家  ›  专栏  ›  技术社区  ›  Ced

把可观察的变成主题

  •  3
  • Ced  · 技术社区  · 7 年前

    我们有一个函数从后端获取一个流作为可观察的。不过,我们希望能够推动到这个可观察的,以及看到的变化之前,这些是在后端完成。为此,我试图回馈一个主题,而不是,但连接仍在进行后,退订。

    换句话说,在下面的代码中,我们希望 console.log(i) 在订阅主题之前不要开始,在取消订阅时不要结束:

    import { ReplaySubject, Observable, interval } from 'rxjs';
    import { tap } from 'rxjs/operators'
    
    function test() {
        const obs = interval(1000).pipe(tap(i => console.log(i)));
        const subj = new ReplaySubject(1);
        obs.subscribe(subj);
        return subj;
    }
    
    const subject = test();
    subject.next('TEST');
    
    const subscription = subject.pipe(
        tap(i => console.log('from outside ' + i))
    ).subscribe()
    setTimeout(_ => subscription.unsubscribe(), 5000);
    

    example

    1 回复  |  直到 7 年前
        1
  •  2
  •   m1ch4ls    7 年前

    你不能 subscribe 在里面 test . 我想你想创造一个可观察的物体 merge 那些-你必须分开归还。

    return [subject, merge(subject, obs)]
    

    然后

    const [subject, obs] = test();
    subject.next()
    

    但我会提供主题作为参数。

    import { ReplaySubject, Observable, interval, merge } from 'rxjs';
    import { tap } from 'rxjs/operators'
    
    function test(subject) {
      return merge(
        interval(1000).pipe(tap(i => console.log(i))),
        subject
      );
    }
    
    const subject = new ReplaySubject(1);
    
    const obs = test(subject);
    subject.next('TEST');
    
    const subscription = obs.pipe(
      tap(i => console.log('from outside ' + i))
    ).subscribe()
    setTimeout(_ => subscription.unsubscribe(), 5000);
    
    推荐文章