angular - 如何从请求中返回 HttpClient 响应正文?
问题描述
我有一个组件依赖于其内容的 API 响应。我已经设置了解析器,但它仍然会在我的数据准备好之前返回。
如何让我的pull_categories()
函数等到收到响应正文然后返回?而不是返回一个空对象,因为它不会等待甚至在我下面的例子中调用它。
服务.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;
}
);
}
组件.ts
categories = [];
constructor(private route: ActivatedRoute) { }
ngOnInit() {
this.route.data.subscribe(
(data: Data) => {
this.categories = data.categories;
}
);
}
解析器.ts
constructor(private categoriesService: CategoriesService) { }
resolve(route: ActivatedRouteSnapshot, state: RouterStateSnapshot): Observable<any> | Promise<any> | any {
return this.categoriesService.pull_categories();
}
应用程序路由.module.ts
{
path: '',
component: HomeComponent,
resolve: {categories: CategoriesResolverService}
}
解决方案
你Subscription
从你的服务(以及你的解析器)返回一个,而不是返回一个 Observable。不要订阅服务。并指定返回值,以避免在脚下射击自己:
getCategories(): Observable<Array<Category>> {
return this.http.get<Something>('https://myapi.com/something').pipe(
map(something => something.response)
);
}
笔记
- 尊重命名约定
- 使用 GET 来...获取数据,而不是 POST
- 该方法定义了它实际返回的内容
- HttpClient.get() 方法的通用重载的使用,它允许指定响应主体的预期类型
- 在服务中有一个实例字段是错误的(也是不必要的)。
阅读HttpClient指南和RxJS quide。
推荐阅读
- vue.js - 在 vuejs webpack 项目中使用来自 Vuetify 的组件时出错
- macos - Openssl 仍然指向 LibreSSL 2.8.3
- reactjs - 在使用效果的功能组件中实现 getDerivedStateFromProps 的正确方法是什么?
- reactjs - 如何在反应谷歌图表的甘特图中指定不同的文本颜色?
- ios - iOS swift 无法设计周历,我已经在我的应用程序中分享了我想要的 UI 截图
- java - Arduino 无法获取串行数据
- r - 我想用 R 语言的正则表达式匹配我的向量中的一些子字符串
- python - 在 pandas DataFrame 中获取至少 6 个月前的最新日期的 id 的值
- java - OptaPlanner 返回空解决方案
- listview - 步进器在点击时未完全显示步进