我有一个依赖于其内容的API响应的组件。我已经设置了解析器,但在我的数据准备好之前它仍然会返回。
如何使我的pull_categories()
功能等到收到响应主体然后返回?而不是返回一个空对象,因为它不会等待甚至在我的情况下调用它。
service.ts
private _categories = [];
constructor(private http: HttpClient) { }
pull_categories() {
this.http.post('https://myapi.com/something', null)
.subscribe(
data => {
this._categories = data['response'];
return this._categories;
}
);
}
component.ts
categories = [];
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.route.data.subscribe(
(data: Data) => {
this.categories = data.categories;
}
);
}
resolver.ts
constructor(private categoriesService: CategoriesService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any {
return this.categoriesService.pull_categories();
}
APP-routing.module.ts
{
path: '',
component: HomeComponent,
resolve: {categories: CategoriesResolverService}
}
首先,在service.ts中,您不需要订阅,您应该订阅您想要实际使用数据的位置。 subscribe
方法返回Subscription
,而不是http api的响应。
您可以将服务方法更新为
pull_categories(): Observable<any> {
return this.http.post('https://myapi.com/something', null);
}
pull_categories
方法将立即返回Observable
,当您在组件(或任何地方)订阅它时,将执行http调用并在subscribe
部分返回响应。
你从你的服务(以及你的解析器)返回一个Subscription
,而不是返回一个Observable。不要订阅服务。并指定返回值,以避免自己在脚下射击:
getCategories(): Observable<Array<Category>> {
return this.http.get<Something>('https://myapi.com/something').pipe(
map(something => something.response)
);
}
注意
阅读qazxsw poi指南和qazxsw poi指南。