Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/neo4j/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Angular 在角度上不接受可观察到的_Angular_Typescript_Asp.net Web Api_Rxjs_Observable - Fatal编程技术网

Angular 在角度上不接受可观察到的

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

当我按下按钮时,我会从服务器获取特定车辆的信息。这是通过订阅一个可观察对象来完成的。当我再次按下同一按钮时,我想取消订阅我正在查看的当前车辆详细信息,以避免在我检查另一车辆的新数据时内存泄漏

我使用的是具有以下属性的VehicleDetail类:

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是不需要的。编辑以避免混淆。