【问题标题】:Synchronous http post angular2同步http post angular2
【发布时间】:2017-10-23 15:43:09
【问题描述】:

我有一个登录组件,用户在其中输入电子邮件和密码。该组件将字段发送到服务,在那里我向我的 nodejs 后端发出 http post 请求,以了解用户是否存在以及密码是否正确。

问题是服务器的响应是未定义的,但是我可以从chrome的网络中获取响应的值。

我认为问题在于请求是异步的,因此它会在实际得到响应之前返回响应。

搜索后,我找不到有关如何使请求同步的非常有用的信息。

这是我的组件和服务的代码!

在我的组件中:

login_function(){
    this.token = this.global.check_login(this.login_user,this.login_pass)
        .subscribe(data => this.postData = JSON.stringify(data));
    console.log(this.token);}
}

在服务中:

check_login(user, pass) {
    let data = {user:user,password:pass};
    let headers = new Headers({ 'Content-Type': 'application/json' }); 
    let options = new RequestOptions({ headers: headers, method:'post' });

    console.log("user:"+user+"\npass:"+pass);

    return this.http.post(url, {username:user,password:pass}, options)
        .map((response:Response)=> response.json());
  }

【问题讨论】:

  • check_login 是异步的,所以 this.token 是未定义的。 check login 返回一个observable,因此您应该订阅 check_login 函数,并在数据可用时将值分配给this.token。您将同步任务与异步任务混合在一起,这就是为什么 this.token 在您记录它时未定义的原因。解决方案不是使请求同步,而是(正确地)订阅可观察的、同步的 http 请求,不推荐。此外,除非在其他地方声明,否则 url 是未定义的。
  • 您应该知道,不推荐使用同步 ajax 调用,因为它会导致糟糕的用户体验,因为它会冻结窗口直到它完成
  • @megamit 因为它是一个登录页面,为了允许用户访问应用程序的其余部分,我需要登录他
  • @LuísCosta - 阅读标记的副本。这将为您在 typescript 和 javascript 中使用异步调用打下坚实的基础。如果您想编写与服务器/服务交互的任何类型的 javascript/typescript 代码,您必须了解这个基本概念以及如何使用回调和 Promise 进行编程。

标签: angular typescript asynchronous


【解决方案1】:

您正确地认为这是由于语句的异步执行。将您的组件代码更改为:

login_function() {
    this.global.check_login(this.login_user, this.login_pass).subscribe(
      data => {
        console.log(data);
      });
 }

服务应更新为以下代码: (假设您的服务器接受 'user' 和 'password' 作为键)

check_login(user,pass){
    console.log("user:"+user+"\npass:"+pass);

    let bodyString = JSON.stringify({user:user,password:pass});
    let headers = new Headers({'Content-Type': 'application/json'}); // ... Set content type to JSON
    let options = new RequestOptions({headers: headers}); // Create a request option
    return this.http
     .post(url,bodyString,options)
     .map((response:Response)=> response.json() );

}

【讨论】:

  • 我在这里假设他接收到 json 对象作为响应
  • 在控制台中打印:{}
  • 什么是“全局”变量。它应该是在您的构造函数中注入的 Service 实例?即构造函数(私有全局:ServiceName){}
  • global 是服务的实例!从 'app/service/global.service' 导入 {GlobalService};构造函数(私有全局:GlobalService){}
  • 您是否使用let data = {user:user,password:pass}; 行中的数据变量?
猜你喜欢
  • 1970-01-01
  • 2016-01-22
  • 1970-01-01
  • 2016-05-04
  • 1970-01-01
  • 1970-01-01
  • 2016-05-14
  • 2023-03-29
  • 2017-03-12
相关资源
最近更新 更多