首页 > 解决方案 > 发出 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()完成其任务之前返回?

请放心,我已经从服务器和数据库端检查了一切,一切都很好。

标签: angulartypescripthttprxjs

解决方案


是的,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;
      }
  );
}

推荐阅读