Javascript 阻止rxjs主题完成

Javascript 阻止rxjs主题完成,javascript,typescript,rxjs,Javascript,Typescript,Rxjs,在下面的示例中,testsub通过take操作符订阅两次到sourcesub其中一个。出现的情况是,当takeObservable完成时,它会导致testsubc完成,即使它仍然有一个活动订阅 我的问题是,为什么这是一种行为,有没有办法阻止这个主题的完成 rxjs 6.4 从'rxjs'导入{Subject}; 从“rxjs/operators”导入{take}; const sourcesub=新主题(); const testsubc=新主题(); testsubc.subscribe({

在下面的示例中,
testsub
通过
take
操作符订阅两次到
sourcesub
其中一个。出现的情况是,当
take
Observable完成时,它会导致
testsubc
完成,即使它仍然有一个活动订阅

我的问题是,为什么这是一种行为,有没有办法阻止这个主题的完成

rxjs 6.4

从'rxjs'导入{Subject};
从“rxjs/operators”导入{take};
const sourcesub=新主题();
const testsubc=新主题();
testsubc.subscribe({
next:s=>console.log(`next:${s}`),
complete:()=>console.log(`completed`)
});
sourcesubc.pipe(take(1)).subscribe(testsubc);
sourcesubc.subscribe(testsubc);
sourcesubc.next('1');

它完成了,因为当
take
操作符返回的可观察对象完成时,调用了它的
complete
方法

受试者是观察者,对
next
error
complete
通知做出响应。如果您只想订阅
next
error
通知,请仅将这些通知转发给主题:

sourceSubj.pipe(take(1)).subscribe({
  next: value => testSubj.next(value),
  error: error => testSubj.error(error) 
});

试着把
Subject
想象成一个有状态的对象,一旦完成,它就停止了它的任务

您应该只使用
merge

从'rxjs'导入{merge,Subject};
从“rxjs/operators”导入{take};
const sourcesub=新主题();
const first=sourcesubc.pipe(取(1));
const subscription=merge(sourcesubc,first)。订阅({
next:s=>console.log(`next:${s}`),
complete:()=>console.log(`completed`)
});
sourcesubc.next('1');

谢谢你的解释,我想从机械的角度看,这也很简单。不过,接下来,rxjs是否提供了一些标准的惯用语(操作符?)来处理这个问题,或者甚至是在这个方向上的一些东西?不完全是。依我看,以这种方式使用主题连接单独组成的可观察流并不常见。这并不是不正确的,我在很多地方都做过——从记忆中,我把一个主题作为观察者传递给了
tap
。我想说的是,这还不够普遍,不足以保证抽象。好吧,太好了!这正是我想要的,我想我可能会有点不标准,谢谢你的澄清:)事实上,这里有一个例子,我把一个传递给
订阅
:谢谢你的回答,但你没有抓住我问题的重点。我知道,当一个主题完成时,它停止了,令人惊讶的是,该主题订阅的任何内容的完成也会触发完成,而不管其他订阅如何。
import { merge, Subject } from 'rxjs';
import { take } from 'rxjs/operators';

const sourceSubj = new Subject<string>();

const first = sourceSubj.pipe(take(1));
const subscription = merge(sourceSubj, first).subscribe({
  next: s => console.log(`next: ${s}`), 
  complete: () => console.log(`completed`)
});

sourceSubj.next('1');