angular - 在服务的构造函数中等待订阅

标签 angular rxjs

在我的服务中,我想等到局部变量 baseurl 未初始化后再发出另一个 http 请求。

下面是我的服务代码:

@Injectable()
export class CoursesService  {
  baseUrl;
  constructor(private http: Http) {
    if(this.baseUrl != undefined){
      this.getJSON().subscribe(data =>
        this.baseUrl=data, 
        error => console.log(error)
      );
    }
}

public getJSON(): Observable<any> {
  return this.http.get("assets/apiDetails.json")
                  .map((res:any) => res.json());
}

getCourses(){
  return this.http.get(this.baseUrl+"/courses")
    .map((res:any) => res.json());
  }
}

正如你所看到的 getCourses 方法使用 baseUrl 变量,所以当我调用 getCourses 方法时,我想等到 baseUrl 未初始化。

我尝试使用 ngOnInit 但它没有在 Injectable 类型类中调用。

最佳答案

baseUrl变成您share()Observable(如此多的调用可以使用相同的结果 - 它使可观察的为hot )并在您的其他通话中使用。像这样的东西应该有效:

import 'rxjs/add/operator/share';
import 'rxjs/add/operator/map'
import 'rxjs/add/operator/mergeMap'
// ...

@Injectable()
export class CoursesService {
  baseUrl$: Observable<string>;

  constructor(private http: Http) {
      this.baseUrl$ =
          this.getJSON()
              .share()
  }

  public getJSON(): Observable<any> {
      return this.http.get("assets/apiDetails.json")
         .map((res: any) => res.json());
  }

  getCourses(): Observable<YourCourseType[]> {
      return this.baseUrl$
          .mergeMap(url => {
              return this.http.get(url + "/courses")
                  .map((res: any) => res.json());
          });
  }
}

关于angular - 在服务的构造函数中等待订阅,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46484310/

相关文章:

javascript - 如何将 for in 循环结果的值打印到数组中

javascript - Angular 2 在不应该更新 View 的时候更新了 View?

javascript - Rxjs 递归与 bindcallback

rxjs - 为什么共享运算符不阻止可观察的触发两次?

javascript - .modal() 函数在 Angular 8 中不起作用

javascript - svg circle - 无法绑定(bind)到 cx,因为它不是已知的 native 属性

Angular 6 - HttpClient - 捕获错误

javascript - 序列化可观察量

javascript - Angular Subscribe 在值更改之前不起作用(需要首先初始化)

java - 检索到的 mysql 数据库对象中的字段全部未定义