如果我在typescript中调用Array.find(),则不调用Subscribe函数

时间:2017-05-02 19:03:58

标签: angular typescript rxjs subscription behaviorsubject

我对Typescript和Web开发真的很陌生。当我订阅某个活动并且无法找到解决方案时,我发现了一件奇怪的事情。 我有一个BehaviorSubject的服务,其中包含carId。我有一个页面,其中有一个id列表,如果我点击一个id,那么它会调用setCarId。到目前为止一切正常。

这是服务:

@Injectable()
export class CarService {
   private carId = new BehaviorSubject("");
   setCarId(carId: string) {
      this.carId.next(carId);
   } 
   getCarId(): Observable<string> {
     return this.carId.asObservable();
   }

我还有另一项服务,我在carId订阅了更改。在这个我有一个汽车对象,我想从我的BehaviorSubject中我的汽车数组中获取该汽车。我得到了我需要的汽车,我的代码中使用array.find方法,并且它正常工作,但不是订阅。我不知道为什么,但是使用此行this.car = this.cars.find(car => car.carId == carId),订阅方法不会被调用,但如果没有该行,它就能正常工作。

@Injectable()
export class MyService {

  subscription: Subscription;
  car: Car;
  cars: Array<Car>;

  constructor(private carService: CarService){
    this.subscription.getCarId().subscribe(carId=> {
       console.log('DO SOMETHING') //


       //with this row NOT working, without this row working
       this.car = this.cars.find(car => car.carId == carId) 
    });

... //MORE CODE

我不知道为什么会这样,以及如何解决,所以请帮助我。

2 个答案:

答案 0 :(得分:0)

我得到了解决方案。我不知道原因,但是在订阅方法中我不能使用任何数组方法,所以例如console.log(this.cars.length)也没有用,不是只是this.cars.find。但是console.log(this.cars)正确地写出了数组。无论如何,解决方案是我用这里的空数组初始化汽车数组。

 cars:Array<Car>=[];

之后一切正常。如果有人可以解释我这样做的原因,那就太棒了,谢谢你们所有的帮助。 :)

答案 1 :(得分:-1)

订阅工作正常,但代码中存在一些问题。

首先,汽车列表未定义,因此无法在列表中找到汽车。

其次,你尝试在this.subscription上调用getCarId方法,但是this.discription没有那个方法,CarService就是这样。

如果您在MyService中初始化您的汽车数组,它会正常工作。

@Injectable()
export class MyService {

subscription: Subscription;
car: any;
cars: Array<any> = [{carId: "1"}, {carId: "2"}];

    constructor(private carService: CarService){
        this.carService.getCarId().subscribe(carId=> {
            console.log('DO SOMETHING') //

            //with this row NOT working, without this row working
            this.car = this.cars.find(car => car.carId === carId) 
        });
    }
}