Существует ли подтвержденная и элегантная идиома отказа от подписки на все существующие, но, возможно, не инициализированные подписки в контроллере?Рассмотрим следующий фрагмент:
/* Somewhere on init */
if(/* condition 1 */) {
this.subscription1 = this.service1().subscribe();
}
if(/* condition 2 */) {
this.subscription2 = this.service2().subscribe();
}
И на этапе очистки:
onDestory() {
try{
this.subscription1.unsubscribe();
this.subscription2.unsubscribe();
} catch e {
/* One of subscriptions was uninitialized */
/* If that was first one, second may be left unsubscribed */
}
}
В принципе, есть некоторые из простых методов, таких как любимая ифология:
if(this.subscription1) {
this.subscription1.unsubscribe();
}
if(this.subscription2) {
this.subscription2.unsubscribe();
}
использование массива подписок вместо полей контроллера:
/* Somewhere on init */
if(/* condition 1 */) {
this.subscriptions.push(this.service1().subscribe())
}
if(/* condition 2 */) {
this.subscriptions.push(this.service2().subscribe())
}
noDestroy() {
this.subscriptions.forEach(s => s.unsubscribe();)
}
Но, может быть, есть некоторые аккуратные и надежные способы решения такой задачи?Согласно моему опыту, ifology является утомительной для сохранения и ее легко забыть обновить, в то время как на основе массива список подписок становится неуправляемым в случае, если вы хотите выборочно отказаться от подписки на выбранную подписку в момент жизненного цикла контроллера, отличный от onDestroy
.