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