【问题标题】:Angular2 first response to POST request undefinedAngular2对POST请求的第一个响应未定义
【发布时间】:2016-07-28 11:54:15
【问题描述】:

我有一个发出 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)。我不知道为什么它只是从第二次得到它。

【问题讨论】:

    标签: angular http-post


    【解决方案1】:

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

    你应该使用类似的东西:

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

    【讨论】:

    • 但我需要 this.loggedin 在 IF 中的 POST 之后。我应该怎么做才能获得 this.loggedin 的价值? if(!this.loggedin) {this.errorMsg = '登录失败';}
    • 要解决您的第一个问题,您可以将loggedIn 属性初始化为false。否则,您需要异步考虑您的应用程序。我不确切知道您的代码,但我会看到类似的内容:this._service.login(this.user).subscribe(loggedIn =&gt; { if (!loggedIn) {this.errorMsg = 'Failed to login'; } }); 明白我的意思吗?
    【解决方案2】:

    这是因为 post 请求是异步的。你应该检查你的 this.loggedin 里面的订阅功能或里面的地图功能。当您在console 上打印它时,this.loggedin 中没有存储任何内容,它将在成功调用 ajax 后更新。

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


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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-05
    • 2014-08-05
    • 2021-08-17
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多