Rxjs 化可观察为主体

Rxjs 化可观察为主体,rxjs,rxjs6,Rxjs,Rxjs6,我们有一个函数,可以从后端获取可观察的流。然而,我们希望能够在后端完成这些更改之前,将其推到可观察到的位置。为此,我尝试返回一个主题,但在取消订阅后,连接仍在继续 换句话说,在下面的代码中,我们希望console.log(i)在订阅主题之前不启动,在取消订阅时结束: import { ReplaySubject, Observable, interval } from 'rxjs'; import { tap } from 'rxjs/operators' function test() {

我们有一个函数,可以从后端获取可观察的流。然而,我们希望能够在后端完成这些更改之前,将其推到可观察到的位置。为此,我尝试返回一个主题,但在取消订阅后,连接仍在继续

换句话说,在下面的代码中,我们希望
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);

您不能在
测试中
订阅
。我猜你想创建一个可观察的对象和一个主体,你必须分别返回它们

return [subject, merge(subject, obs)]
然后

const [subject, obs] = test();
subject.next()
但我会通过提供subject作为参数来实现

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);