Angular 2-http get return неверный объект

Я использую @angular / http get для извлечения данных с сервера, вот мой код :

private _currentPT: any;
public phongtroDetailChange = new Subject();

layPhongtro(id: number): Promise<any> {
return new Promise((resolve, reject) => {
  this.http
    .get(Constants.apiUrl + 'phongtro/' + id, { headers: Constants.headers })
    .map((resp: Response) => resp.json())
    .subscribe(resp => {
      console.log(resp);
      // if (!resp.result) {
      //   this._currentPT = resp;
      //   this.phongtroDetailChange.next(true);
      //   resolve(resp);
      // } else {
      //   this.handleError('layPhongtro', resp.result);
      //   reject(resp.result);
      // }
    },
    error => this.handleError('layPhongtro', error));
});
}

Когда я прокомментировал такой код, свойство «tiencoc» resp имеет правильное значение, которое означает, что его значение равно 0, вот изображение консоли.бревно

https://i.stack.imgur.com/7oYGW.png

Но когда я раскомментировал, значение » tiencoc «такое же, как свойство» giatien», теперь его значение 1000000, вот картина консоли.журнал при незафиксированном

https://i.stack.imgur.com/rGxdI.png

Не знаю почему ? Pls помогает мне, спасибо так много

P/ s: Я проверил с почтальоном, и resp в порядке, что означает, что значение «tiencoc» равно 0

2 ответа

  1. Вот скрипка для демо: https://jsfiddle.net/Lg6L8n2m / (угадайте значение, прежде чем смотреть на журнал :))

    Как я уже упоминал это комментарий, Когда вы JSON.stringifyобъект ответа вы печатаете это значение (потому что строки неизменяемы в js). Но без stringify, console.logработает фактически несколько «асинхронно», console.logпечатает последнее значение, которое имеет объект.

    Так вы меняете tientocбыть 1000000где-то в вашем коде после вашего console.log. И консоль.журнал печатает последнее значение. Из того, что я вижу, это может быть в блоке, где вы подписываетесь на свою тему phongtroDetailChange

    Я предлагаю прочитать Immutability в javascript об этой проблеме.

  2. Спасибо @echonax, я сейчас читаю «Immutability in javascript»:), и кстати я обнаружил, что в child component я это сделал:

    constructor(private ptService: PhongtroService) {
        this.init();
      }
    
    ngOnInit() {
        this.ptService.phongtroDetailChange.subscribe(result => {
          if(result) {
            this.init();
          }
        });
    }
    init() {
      this.currentPT = this.ptService.currentPT;
      if(!this.currentPT.tiencoc || this.currentPT.tiencoc === 0) {
         this.currentPT.tiencoc = this.currentPT.giatien;
      }
    }
    

    Я сохранил currentPT ptService в currentPT дочернего компонента (this.currentPT), а затем изменить значение этого.currentPT

    а в птсервисе

    private _currentPT: any;
    get currentPT(): any{
    return this._currentPT;
    }
    set currentPT(pt) {
    this._currentPT = pt;
    }
    

    и в функции layPhongtro выше

    this._currentPT = resp;
    this.phongtroDetailChange.next(true);
    

    Каким-то образом код в дочернем компоненте также влияет на этот resp