Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/angular/31.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 创建永不终止的订阅_Angular_Rxjs_Rxjs6 - Fatal编程技术网

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