【发布时间】: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