2017-01-18 5 views
3

Если у меня есть сервис, содержащий наблюдаемом и у меня есть следующий код ...Можно ли удалить только один наблюдатель RXJS из наблюдаемого?

this.collapse.newChild.subscribe(name => { 
     if (name === "helpArea") { 
      this.collapse.process("helpArea", true); 
     } 
     // I would like to detach now 
    }); 

Можно ли снять без отмены подписки оригинала? Если я звоню unsubscribe, то когда я звоню this.collapse.newChild.next("thing"), он выдает ошибку Error: object unsubscribed.

Так что я не думаю, что отписаться - это то, что я ищу, так есть способ отсоединить одного наблюдателя?

В работе вокруг на данный момент я использую ...

this.collapse.newChild.map(name => name === "helpArea").first().subscribe(...)

ответ

1

Я не думаю, что ваш «обходной путь» это совсем плохо. Это даже кажется идиоматичным: способ, которым Rx хочет вам это сделать. Но вы можете записать его немного короче, используя форму first, которая берет предикат.

this.collapse.newChild 
     .first(name => name === "helpArea") 
     .subscribe(...); 

В общем, образом мышления, чтобы попасть в с Rx является максимально комбинаторами использования для управления потоками, чтобы произвести именно те значения, которые вам нужны, а затем подписаться с помощью простого обработчика, который применяется окончательным, effectful , шаг: обновление пользовательского интерфейса, вызов службы и т. д. Это приведет к более чистому, более выразительному коду, который легче читать и проще использовать повторно.

Еще одна приятная вещь в этом подходе к вашему примеру заключается в том, что отменить подписку не нужно. RX сделает это для вас после первого значения, потому что он знает, что их будет не больше. Так что это намного чище, чем делать это самостоятельно.

1

Ответ Peter правильный от дизайна/практики PoV, но остерегайтесь также, что вы получите эту ошибку, потому что вы unsubscribe темы.

То, что вы хотите, чтобы остановить это подписка вместо:

var subscription = this.collapse.newChild.subscribe(...) 

// NOT this 
// this.collapse.newChild.unsubscribe() 

// this 
subscription.unsuscribe() 

Это будет убивать/остановить не в тему, но только текущая подписка на него.

0

Вызов unsubscribe() в объекте подписки не подлежит подписке только на этого конкретного наблюдателя. Поэтому вопрос заключается в том, как вы отменили подписку на первое место, потому что использование first() отправляет полное уведомление, которое в любом случае вызывает отмену подписки.

Btw, вы всегда можете отказаться от подписки в обратный вызов вашего собственного абонента:

var subscription = this.collapse.newChild.subscribe(name => { 
    if (name === "helpArea") { 
     this.collapse.process("helpArea", true); 
    } 
    subscription.unsubscribe(); 
}); 
Смежные вопросы