在我的服务中,我想等到局部变量 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
变成你 Observable
的 share()
(这么多调用可以使用相同的结果 - 它正在制作可观察的 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/