从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中的服务是单身人士。这意味着该服务将在您的应用程序的整个生命周期中存在。
您需要取消订阅observable的原因是为了避免内存泄漏。你什么时候得到内存泄漏?如果某些内容已被垃圾收集,而它仍然订阅了一个可观察的,事件监听器,套接字,......
由于Angular服务永远不会被破坏,除非您的整个应用程序被破坏,否则没有真正的理由取消订阅它。只要您的应用程序执行,observable将完成或错误或继续运行。
结论:取消订阅服务是没有意义的,因为没有内存泄漏的可能性。
您不需要取消订阅由Http
或HttpClient
创建的可观察量,因为它是有限可观察的(值将仅发出一次并且将调用complete
)。
但是,您可以取消订阅HttpClient
创建的observable来取消请求。这意味着您不再对请求返回的数据感兴趣。