2016-11-29 9 views
8

Какова наилучшая практика отмены подписки в службе Angular2 из подписки на http?Angular2: Отказаться от http, наблюдаемого в службе

В настоящее время я делаю это, но я не уверен, что это будет лучший способ.

import { Injectable } from "@angular/core"; 
import { Http } from "@angular/http"; 

import { Subject } from "rxjs/Subject"; 
import { ISubscription } from "rxjs/Subscription"; 

@Injectable() 
export class SearchService { 
    private _searchSource = new Subject<any>(); 

    public search$ = this._searchSource.asObservable(); 

    constructor(private _http: Http) {} 

    public search(value: string) { 
     let sub: ISubscription = this._http.get("/api/search?value=" + value) 
      .map(response => <any>response.json()) 
      .do(data => this._searchSource.next(data)) 
      .finally(() => sub.unsubscribe()).subscribe(); 
    } 

} 
+3

Кажется излишним и бессмысленным, чтобы отказаться от подписки, когда наблюдаемое завершено. –

+1

@ günter-zöchbauer Ну, это был не мой вопрос, если это имеет смысл, мой вопрос: Какая лучшая практика. Так? –

+0

Я не думаю, что есть лучшие практики для вещей, которые не имеют смысла: D Возможно, просто ... не делайте этого. –

ответ

19

Служба в угловом является одноэлементным. Это означает, что служба будет существовать на весь срок службы вашего приложения.

Причина, по которой вам необходимо отказаться от наблюдаемого, заключается в том, чтобы избежать утечек памяти. Когда вы получаете утечки памяти? Если что-то было собрано в мусор, когда оно все еще подписано на наблюдаемого, слушателя событий, гнездо, ...

Поскольку Угловая служба никогда не будет уничтожена, если все ваше приложение не будет уничтожено, нет никакой реальной причины отказаться от подписки Это. Наблюдаемый будет либо завершен, либо будет ошибкой или продолжит работу до тех пор, пока ваша заявка будет выполнена.

Заключение: Отмена подписки на услугу является бессмысленной, поскольку нет никаких утечек памяти.

+0

Спасибо за ответ @kwintenp. Но, как вы видите выше, каждый вызов метода поиска создаст новое наблюдаемое, которое я должен подписаться, чтобы получить данные. Разве я не должен был отменить подписку, чтобы избежать утечек памяти? –

+1

Это нормально. Каждая возвращенная подписка будет очищаться. HTTP-сервис очищается после себя. Когда получен результат XHR, вызывается полный метод подписки и, следовательно, не подписывается. Однако может быть случай для вызова метода отмены подписки на возвращаемом Observable http-сервисе. Если мы когда-либо хотели отменить наш HTTP-запрос, мы бы отменили подписку. Это вызывает прерывание под крышками, чтобы завершить очистку. – Thibs

+5

«Служба будет существовать на протяжении всего срока действия вашего приложения» не соответствует действительности. Я могу предоставить услугу только для жизни компонента, так что он будет уничтожен, когда компонент будет уничтожен ... –