Angular 创建永不终止的订阅
我想从孩子到家长进行沟通,如中所述。服务创建要通过其进行通信的主题:Angular 创建永不终止的订阅,angular,rxjs,rxjs6,Angular,Rxjs,Rxjs6,我想从孩子到家长进行沟通,如中所述。服务创建要通过其进行通信的主题: progressSubject=新主题 家长订阅主题并对消息作出反应: this.service.progressSubject.subscribe(msg=>showProgress(msg)) 客户端可以使用progressSubject.next()发送消息,这很好。 但是,如果我想订阅另一个可观察对象的progressSubject,那么如果源可观察对象完成,所有订阅都将终止。父对象将不再对输入做出反应 let fir
progressSubject=新主题
家长订阅主题并对消息作出反应:
this.service.progressSubject.subscribe(msg=>showProgress(msg))
客户端可以使用progressSubject.next()
发送消息,这很好。
但是,如果我想订阅另一个可观察对象的progressSubject
,那么如果源可观察对象完成,所有订阅都将终止。父对象将不再对输入做出反应
let first = new Subject();
first.subscribe(this.service.progressSubject);
first.next(3); // value is processed by subscribers to progressSubject
first.complete();
let second= new Subject();
second.subscribe(this.service.progressSubject);
second.next(3); // original subcription to progressSubject is ended,
// value is not processed anymore.
如何忽略某个主题的“完成”事件,以便多个源可以连接到该主题?I
const first = new Subject();
const progressSubject = new Subject();
first.subscribe(progressSubject);
// is equal to
first.subscribe({
next: val => progressSubject.next(val),
error: err => progressSubject.error(err),
complete: () => progressSubject.complete,
});
// if you don't need `complete` - just don't pass it )
first.subscribe({
next: val => progressSubject.next(val),
error: err => progressSubject.error(err),
});
此外,我们还可以为此创建帮助器:
function skipComplete(subject){
return {
next: val => subject.next(val),
error: err => subject.error(err),
}
}
first.subscribe(skipComplete(progressSubject))
II
正如@IngoBürk提到的,我们可以使用concat(NEVER)
:
首先,为什么要进行完整的操作?因为源可以是可观察的,例如,来自已经完成了完整操作的AJAX调用。我想转换源代码,然后将我的主题订阅到源代码,但是从源代码中过滤掉完整的事件这基本上就是我现在使用的,但是感觉很笨拙。我正在寻找一些东西放入管道中…
函数skipCompleteFactory(subject){return{next:val=>subject.next(val),error:err=>subject.error(err),}}}首先。订阅(skipCompleteFactory(progressSubject))
您可以将concat(NEVER)
管道传输到您订阅的主题。这实际上也会禁用完整通知。@IngoBürk智能解决方案,但它会阻止流完成(我们需要处置订阅所持有的资源)。对实际资源的订阅也不会保留在我的解决方案中。只有对“永不可见”的订阅。这里面真的没有任何开销。
first
.pipe(concat(NEVER))
.subscribe(progressSubject);