Не удается прочитать свойство «добавить».Rxjs Подписка - PullRequest
0 голосов
/ 13 февраля 2019

Я начал оптимизировать свой код и хочу отписаться от подписок в ngOndestroy.У меня есть несколько подписок.Проблема в том, что когда я хочу вызвать метод add () для добавления дополнительных дочерних подписок, он говорит, что не может прочитать свойство add из undefined.Я упростил свой код, чтобы вы могли видеть только важные вещи.

import {Subscription} from 'rxjs';

export class DashboardComponent implements OnInit, OnDestroy {
     private subscription: Subscription;
}

ngOnInit() {
   this.getData();
   this.getFeed();
}

ngOndestroy {
if (this.subscription) {
   this.subscription.unsubscribe();
   console.log(this.subscription);
   }
}

getData() {
   const subscription = this._authService.currentCompanyId.subscribe((newCompanyId) => {
            this.driverSubs(newCompanyId);
            this.vehicleSubs(newCompanyId);
        });
        this.subscription.add(subscription);
    }

   driverSubs(newCompanyId) {
        const subscription = this._driversService.getAllDrivers(newCompanyId).subscribe((data) => {
            this.getDataForDrivers(data);
        });
        this.subscription.add(subscription);
    }

    vehicleSubs(newCompanyId) {
        const subscription = this._vehiclesService.getAllVehicles(newCompanyId).subscribe((data) => {
            this.getDataForVehicles(data);
        });
        this.subscription.add(subscription);
    }
}

getFeed() {
    this.feedSubs();
    this.feedTachoSubs();
}

feedSubs() {
    const subscription = this._feedService.getFeed().subscribe(response => {
        this.feed = response;
    });
    this.subscription.add(subscription);
}

feedTachoSubs() {
    const subscription = this._feedTachoService.getFeedForVehicles().subscribe(response => {
        this.feedTacho = response;
    });
    this.subscription.add(subscription);
}

Ответы [ 3 ]

0 голосов
/ 13 февраля 2019

Другое решение - Хотя ответ Даниэль делает свое дело, он содержит массив различных объектов подписки.
Если вы хотите хранить только ОДИН Подпискаи всякий раз, когда вы отписываетесь, вы хотите, чтобы все они также отписались.
Вы просто создаете это.

private subscriptions: Subscription;

и затем в конструкторе вы инициализируете объект:

this.subscriptions = new Subscription();

и затем вы можете использовать:

this.subscriptions.add( ... Your subscription... );

, если вы хотите отписаться:

if(this.subscriptions){
  this.subscriptions.unsubscribe();
}

и все дочерние подписки также откажутся от подписки.
---
Когда вы пытались подписаться на .add (), ваша основная подписка была неопределенной, поэтому вы не могли добавить новую.

0 голосов
/ 13 февраля 2019

Как сказал Дэниел, ваш ученик должен быть массивом подписок для обработки всех из них.

В дополнение к его ответам я бы предложил использовать "асинхронный канал" везде, где вы можете, поэтомуangular сам откажется от подписки.

0 голосов
/ 13 февраля 2019

Ваше поле должно быть не private subscription: Subscription;, а:

private subscriptions: Subscription[] = [];

-> т.е. массив.А затем вы добавите к нему подписки с помощью:

this.subscriptions.push(subscription)

В ngOnDestroy вам потребуется выполнить итерацию этого массива и отписаться от каждой подписки:

for(const subscription of this.subscriptions) {
    subscription.unsubscribe();
}
...