[英]Wait for subscription in constructor of a Service
在我的服務中,我想等到本地變量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
share()
(這么多調用可以使用相同的結果 - 它使可觀察的熱點 )並在您的其他調用中使用。 這樣的事情應該有效:
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());
});
}
}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.