angular - 发出 HTTP 请求时,RxJS 订阅如何工作?
问题描述
export class VendorHttpService {
result = '0';
constructor(private http: HttpClient, private global: GlobalService) { }
getProfileStatus(uid: String): string {
this.http.get(this.global.getUrl()+"/vendor/profile-status/"+uid).subscribe(
(val: number) => {
this.result = String(val);
console.log("got executed "+this.result)
}, error => {
//console.log("error")
this.result = error;
}
);
return this.result;
}
}
因此,从 Angular 8 中的上述代码可以看出,我正在使用RxJS向服务器发出 HTTP 请求,但在方法内部,我想从请求中返回值,而不是整个RxJS 订阅组件。如您所见,我已经声明了一个名为result的变量,我在方法中对其进行了更新,然后将其返回,但是当我在组件中调用此方法getProfileStatus()时,我得到的初始值为 0。
不明白为什么不更新?我想知道 RxJS 在Subscribe()方法中的行为。
方法getProfileStatus()是否在Subscribe()完成其任务之前返回?
请放心,我已经从服务器和数据库端检查了一切,一切都很好。
解决方案
是的,getProfileStatus() 在 Subscribe() 完成其任务之前返回。当您订阅时,您正在触发请求并让浏览器知道当答案到达时,它必须使用您提供的功能来处理它。然后它只是继续下一行,但订阅中的函数正在等待执行。我建议这样做的方法是返回可订阅而不是值并从您的组件订阅。所以这将为您服务:
getProfileStatus(uid: String): Observable<string> {
return this.http.get(this.global.getUrl()+"/vendor/profile-status/"+uid)
}
在你的组件中应该有这样的东西:
constructor(private vendorHttp: VendorHttpService){}
functionName() {
this.vendorHttp.getProfileStatus("some_uid").subscribe(
(val: number) => {
this.result = String(val);
console.log("got executed "+this.result)
}, error => {
//console.log("error")
this.result = error;
}
);
}
推荐阅读
- jenkins - 无法解决 Jenkins NotSerializableException 错误
- python - Python多处理进程终止?
- c++ - c++17折表达式语法
- python - Python - to_dict() 创建不需要的嵌套字典
- elasticsearch - == 检查两个字段 elasticsearch
- php - 如何在不刷新页面的情况下根据选择框值从codeigniter中的数据库获取值?
- c# - 更新datagridview C#中的数量
- java - JPA Query 错误地使用括号导致不同的查询
- python - 如何在 Matplotlib TextBox 小部件中设置光标位置?
- r - 指定具有已定义结构的列名