Angular 2 - http get返回错误的对象

时间:2016-11-05 15:43:24

标签: angularjs angular angular-promise observable angular-http

我正在使用@ 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));
});
}

当我评论这样的代码时,resp的属性“tiencoc”具有正确的值,这意味着它的值为0,这是console.log的图片

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

但是当我取消注释时,“tiencoc”的值与属性“giatien”相同,现在它的值为1000000,这里是取消注释时console.log的图片

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

我不知道为什么?请帮助我,非常感谢你

P / s:我用POSTMAN测试过,resp没问题,这意味着“tiencoc”的值为0

2 个答案:

答案 0 :(得分:0)

这里是演示的小提琴:https://jsfiddle.net/Lg6L8n2m/(在查看日志之前猜测值是什么:))

正如我在JSON.stringify您正在打印该值的响应对象时所提到的注释(因为字符串在js中是不可变的)。但是没有stringify,console.log实际上有点&#34;异步&#34;,console.log打印对象具有的最新值。

因此,您要在tientoc后的代码中将1000000更改为console.log。并且console.log会打印出最新的值。从我看到的可能是您订阅主题phongtroDetailChange

的块中

我建议在javascript中阅读关于此问题的Immutability。

答案 1 :(得分:0)

谢谢@echonax,我现在正在阅读“javascript中的不变性”,顺便说一句,我发现在子组件中我做到了这一点:

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;
  }
}

我已将ptService的currentPT存储在子组件的currentPT(this.currentPT)中,然后更改this.currentPT的值

和ptService

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

并在layPhongtro函数上面

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

某些方式,子组件中的代码也会影响此resp