Angular 在角度上不接受可观察到的
当我按下按钮时,我会从服务器获取特定车辆的信息。这是通过订阅一个可观察对象来完成的。当我再次按下同一按钮时,我想取消订阅我正在查看的当前车辆详细信息,以避免在我检查另一车辆的新数据时内存泄漏 我使用的是具有以下属性的VehicleDetail类:Angular 在角度上不接受可观察到的,angular,typescript,asp.net-web-api,rxjs,observable,Angular,Typescript,Asp.net Web Api,Rxjs,Observable,当我按下按钮时,我会从服务器获取特定车辆的信息。这是通过订阅一个可观察对象来完成的。当我再次按下同一按钮时,我想取消订阅我正在查看的当前车辆详细信息,以避免在我检查另一车辆的新数据时内存泄漏 我使用的是具有以下属性的VehicleDetail类: export class VehicleDetail { id: number; name: string; alarm: Alarms[] | null; signalinfo: SignalInfo[]; position: P
export class VehicleDetail {
id: number;
name: string;
alarm: Alarms[] | null;
signalinfo: SignalInfo[];
position: Position | null;
}
这是我在my.service.ts中的代码:
getVehicleDetail(id: number): Observable<VehicleDetail> {
const url = `${this.vehiclesUrl}/${id}/${'detail'}`;
return this.http.get<VehicleDetail>(url).pipe(
tap(_ => this.log(`fetched vehicle detail id=${id}`)),
catchError(this.handleError<VehicleDetail>(`getVehicledetail id=${id}`))
);
}
在my.component.ts中:
import { Component, OnInit } from '@angular/core';
import { Observable, Subject } from 'rxjs';
import { takeUntil } from 'rxjs/operators';
import * as Leaflet from 'leaflet';
import { VehicleService } from '../vehicle.services';
import { VehicleDetail } from '../models/vehicle-detail';
.........
vehicleDetail: VehicleDetail;
private unsubscribe$ = new Subject();
.........
getVehicleDetail(): Observable<VehicleDetail> {
const details = this.vehicleService
.getVehicleDetail(this.vehicleService.vehicleId);
details.takeUntil(this.unsubscribe$).subscribe(data => {
this.vehicleDetail = data;
});
return details;
}
updateInfo(item): void {
this.unsubscribe$.next();
this.unsubscribe$.complete();
this.vehicleService.vehicleId = item;
console.log(this.vehicleService.vehicleId);
this.getVehicleDetail().takeUntil(this.unsubscribe$).subscribe(() => {
if (this.vehicleDetail.position) {
this.setMap();
return;
}
this.map.flyTo(new Leaflet.LatLng(50.7089, 10.9746), 4, {
animate: true,
duration: 4
});
});
}
我得到的错误来自TakeTill,它说:
错误TS2339:类型上不存在属性“takeUntil”
“可观察的”
我做错了什么?一个http请求,您不需要在其中创建套接字,也不需要取消对可观察对象的注册,它将最终完成状态。为什么不直接从updateInfo调用服务,并使用作为param接收的id
updateInfo(vehicleId: number): void {
this.vehicleService.getVehicleDetail(vehicleId)
.subscribe((data) => {
this.vehicleDetail = data;
if (this.vehicleDetail.position) {
this.setMap();
return;
}
this.map.flyTo(new Leaflet.LatLng(50.7089, 10.9746), 4, {
animate: true,
duration: 4
});
});
}
如果你使用的是RxJS 6,你需要这样做。是什么让你认为不取消订阅可能会导致mem。泄漏?同时有数百个subsection@Jota.Toledo不是一个很大的缺陷吗?take1在你描述的情况下是一个noop,因为被观察者只会自然发出一次。你是对的,http完成了被观察者,take1是不需要的。编辑以避免混淆。