Angular2对POST请求的第一个响应未定义

时间:2016-07-28 11:54:16

标签: angular http-post

我有一个发出POST请求的简单方法

postData(){
  var headers = new Headers();
  headers.append('Content-Type', 'application/json');
  var json = JSON.stringify({email: 'Admin', password: 'Admin'});

  return this._http.post('http://localhost:8080/addressbook_rest/api/v1/contacts/login',  json , 
    {headers: headers});

}

然后从另一个组件调用上面的方法

onLogin() {
  this._service.postData().map(res => res.json()).subscribe(
    data => { this.loggedin = data },
    err => { console.log(err); }
  );

  console.log(this.loggedin);
}

问题是在第一次调用时,变量this.loggedin是未定义的,但之后我得到了我想要的东西(this.loggedin = true)。我不知道为什么它只能从第二次获得它。

2 个答案:

答案 0 :(得分:2)

实际上,这是因为请求是异步处理的。这意味着console.log(this.loggedIn);将首次返回undefined,因为它在subscribe回调之外。它在收到请求响应之前执行。

你应该使用类似的东西:

onLogin() {
  this._service.postData().map(res => res.json()).subscribe(
    data => {
      this.loggedin = data;
      console.log(this.loggedin); // <-------
    },
    err => { console.log(err); }
  );
}

答案 1 :(得分:1)

这是因为post请求是异步的。你应该检查你的this.loggedin内部订阅功能或内部地图功能。 this.loggedinconsole上打印时没有任何内容存储在成功的ajax调用后会更新。{1}}

查看此服务here希望它能帮助您解决问题。的 dragon.service.ts

要在POST后使用.then()进行检查,这是成功承诺的回调。它会在你的ajax调用返回时运行。你应该在那里使用console.log()。