在我的服务中,我想等到局部变量 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/