Angular2:取消订阅服务中的http observable

问题描述 投票:24回答:2

从http订阅中取消订阅Angular2服务的最佳做法是什么?

目前我这样做,但我不确定这是否是最好的方式。

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();
    }

}
angular rxjs5 unsubscribe
2个回答
63
投票

Angular中的服务是单身人士。这意味着该服务将在您的应用程序的整个生命周期中存在。

您需要取消订阅observable的原因是为了避免内存泄漏。你什么时候得到内存泄漏?如果某些内容已被垃圾收集,而它仍然订阅了一个可观察的,事件监听器,套接字,......

由于Angular服务永远不会被破坏,除非您的整个应用程序被破坏,否则没有真正的理由取消订阅它。只要您的应用程序执行,observable将完成或错误或继续运行。

结论:取消订阅服务是没有意义的,因为没有内存泄漏的可能性。


0
投票

您不需要取消订阅由HttpHttpClient创建的可观察量,因为它是有限可观察的(值将仅发出一次并且将调用complete)。

但是,您可以取消订阅HttpClient创建的observable来取消请求。这意味着您不再对请求返回的数据感兴趣。

© www.soinside.com 2019 - 2024. All rights reserved.