Как правильно отписаться от этого вида obervable - PullRequest
0 голосов
/ 02 ноября 2018

У меня есть метод getDimensions, который возвращает Observable<string[]>.

dimension.service.ts

public getDimensions(id: string): Observable<string[]> {
    return this.service.loadDimensions(id);
}

reloader.service.ts

public update(idsToUpdate: string[]): void {

    idsToUpdate.map(id => this.dimensionService.getDimensions(id)).pipe(
        map(
             newDimensions => this.updateDimensions(newDimensions)
        )
    ).subscribe(); // ToDo: unsubscribe

}

Затем в другой части приложения я вызываю этот метод внутри update метода. Проблема в том, что я не знаю, как правильно отписаться от getDimensions. Одним из возможных решений может быть создание Subscription, а затем OnDestroy вызов отказа от подписки, но для меня это не очень хорошее решение:

  • это сервис, который я использую во всем приложении, поэтому перехват OnDestroy никогда не произойдет
  • Я вызываю метод update каждые n секунд, так что каждые n секунд будет новая подписка

Возможное решение: (Не хорошо)

reloader.service.ts

private subscriptions: Subscription = new Subscription();

...
...

public update(idsToUpdate: string[]): void {

    const sub = idsToUpdate.map(id => this.dimensionService.getDimensions(id)).pipe(
        map(
             newDimensions => this.updateDimensions(newDimensions)
        )
    ).subscribe(); // ToDo: unsubscribe

    this.subscription.add(sub);

}

...
...

public onDestroy(): void {
    this.subscription.unsubscribe();
}

EDIT:

Как упомянул @jgerstle в своем комментарии, если наблюдаемое завершается (это мой случай), нет необходимости отписываться.

Ответы [ 2 ]

0 голосов
/ 02 ноября 2018

Функция добавления подписок может не выполнять то, что вы пытаетесь сделать. Из документации говорится следующее.

   /**
     * Adds a tear down to be called during the unsubscribe() of this
     * Subscription.
     *
     * If the tear down being added is a subscription that is already
     * unsubscribed, is the same reference `add` is being called on, or is
     * `Subscription.EMPTY`, it will not be added.
     *
     * If this subscription is already in an `closed` state, the passed
     * tear down logic will be executed immediately.
     *
     * @param {TeardownLogic} teardown The additional logic to execute on
     * teardown.
     * @return {Subscription} Returns the Subscription used or created to be
     * added to the inner subscriptions list. This Subscription can be used with
     * `remove()` to remove the passed teardown logic from the inner subscriptions
     * list.
     */
    add(teardown: TeardownLogic): Subscription;

Полагаю, вы хотите отписаться от вашей idsToUpdate -подписки. Вы можете сделать это, сохранив ссылку на подписку, как и вы, и выполните sub.unsubscribe()

Вот пример изменения вашего кода

private sub: Subscription;

...
...

public update(idsToUpdate: string[]): void {

    this.sub = idsToUpdate.map(id => this.dimensionService.getDimensions(id)).pipe(
        map(
             newDimensions => this.updateDimensions(newDimensions)
        )
    ).subscribe(); // ToDo: unsubscribe

}

...
...

public onDestroy(): void {
    if(this.sub) this.sub.unsubscribe();

}
0 голосов
/ 02 ноября 2018

Если вы хотите отписаться, когда вы получили данные или наблюдаемо завершено

public update(idsToUpdate: string[]): void {

    const sub = idsToUpdate.map(id => this.dimensionService.getDimensions(id)).pipe(
        map(
             newDimensions => this.updateDimensions(newDimensions)
        )
    ).subscribe(() => sub.unsubscribe() ); // or you can use complate 

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...