2016-11-29 6 views
8

http 구독에서 Angular2 서비스를 구독 취소하는 가장 좋은 방법은 무엇입니까?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

나는 감각이없는 것들에 대한 모범 사례가 없다고 생각한다 : 아마도 아마도 -하지 말라. –

답변

19

각도로 표시되는 서비스는 싱글 톤입니다. 이는 서비스가 전체 응용 프로그램 수명 동안 존재 함을 의미합니다.

관측 가능 대상에서 구독을 취소해야하는 이유는 메모리 누수를 방지하기 위해서입니다. 언제 메모리 누수가 발생합니까? 관찰 가능한 이벤트 리스너, 소켓에 여전히 가입되어있는 동안 가비지 수집 된 것이 있다면 ...

각도 서비스가 절대 파괴되지 않기 때문에 전체 애플리케이션이 파기되지 않는 한 탈퇴 할 실질적인 이유가 없습니다. 그것. observable은 응용 프로그램이 수행하는 동안 완료되거나 오류가 발생하거나 계속 진행됩니다.

결론 : 서비스 누락은 메모리 누출 가능성이 없기 때문에 무의미합니다.

+0

@kwintenp에 감사드립니다. 그러나 위에서 보았 듯이 검색 메서드를 호출 할 때마다 데이터를 얻기 위해 구독해야하는 새로운 관찰 가능 항목이 만들어집니다. 메모리 누출을 피하기 위해 구독을 구독 취소하지 않았습니까? –

+1

괜찮습니다. 반환 된 모든 구독은 스스로 정리합니다. HTTP 서비스는 자체적으로 정리됩니다. XHR 결과가 수신되면 구독의 전체 메서드가 호출되므로 구독 자체가 취소됩니다. 그러나 HTTP 서비스에서 반환 된 Observable에 대해 unsubscribe 메서드를 호출하는 경우가있을 수 있습니다. 우리가 진행중인 HTTP 요청을 취소하고 싶다면 우리는 탈퇴라고 부를 것이다. 이 작업은 정리 작업을 완료하기 위해 덮개 아래에서 중단을 요청합니다. – Thibs

+5

"서비스가 전체 응용 프로그램 수명 동안 존재합니다."는 사실이 아닙니다. 구성 요소의 수명 동안 서비스를 제공 할 수 있으므로 구성 요소가 파괴되면 파괴 될 수 있습니다. –

관련 문제