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

}

推荐答案

在Angular中,服务是单例的.这意味着该服务将在应用程序的整个生命周期内存在.

您需要取消订阅observable的原因是为了避免内存泄漏.什么时候会出现内存泄漏?如果某个内容在订阅到可观察的事件侦听器、套接字时被垃圾收集...

由于Angular服务永远不会被销毁,除非你的整个应用程序都被销毁,所以没有真正的理由取消订阅.只要你的应用程序运行,可观测的数据要么完整,要么出错,要么继续运行.

结论:取消订阅服务是毫无意义的,因为不存在内存泄漏的可能性.

Angular相关问答推荐

MAT表的内联文本编辑-未刷新编辑图标

如何在Angular 17 SSR中处理Swiper 11 Web组件事件

使用Angular 13的NgxPrinterService打印时,第二页上的空白区域

material 对话框中没有合适的注塑

MAT-复选框更改事件未在onSubscriberCheck函数中返回选中的值

在Angular 17的本地服务应用程序时禁用SSR

Angular 单位测试表

无法绑定到formControl,因为它不是input的已知属性

Angular Signals 如何影响 RXJS Observables 以及在这种情况下变化检测会发生什么

对象中的值丢失 angular ngrx

在组件级别加载 JS 脚本(不在启动时)

清除Angular2中的输入文本字段

错误:您要查找的资源已被删除、名称已更改或暂时不可用

无法绑定到matMenuTriggerFor,因为它不是 button的已知属性

检测指令中输入值何时更改

Angular7 中的 CORS 策略已阻止源http://localhost:4200

得到了预期表达式的插值 ({{}})

如何以编程方式触发`valueChanges`?

为什么 *ngIf 不适用于 ng-template?

将 [NgStyle] 与条件组合(if..else)