Создать подписку, которая никогда не заканчивается - PullRequest
0 голосов
/ 28 августа 2018

Я хочу общаться от детей с родителями, как описано в Угловая поваренная книга . Служба создает тему, через которую можно общаться:

progressSubject = new Subject<ProgressMessage>

Родитель подписывается на Субъект и реагирует на сообщения:

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.

Как я могу проигнорировать событие «завершить» в Субъекте, чтобы к этому Субъекту могли подключаться несколько источников?

1 Ответ

0 голосов
/ 04 сентября 2018

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

first
  .pipe(concat(NEVER))
  .subscribe(progressSubject);
...