angular - 如何返回来自响应的数据
问题描述
我有一个通过执行 getName 函数开始的服务,然后当一些数据进入 getPlace 函数的 else 块时,而不是常规对象,我得到一个订阅者(如您在屏幕截图中看到的那样),尽管理论上我订阅了我分配值的更改。它可以修复吗?
解决方案
正如其他人所说,您不能将 http 请求(http.get)视为程序代码。http请求是异步的,方法中的代码只有在服务器返回数据后.pipe()
才会执行。
因此getPlace()
,您的方法将无法data
通过调用该_getPlace()
方法简单地返回。
而不是与这种工作方式作斗争并试图“修复”它。我建议您将两者都作为 Observables 处理。
我在类似情况下的代码如下所示:
服务
import { Observable, of, throwError } from 'rxjs';
import { catchError, tap } from 'rxjs/operators';
getProducts(): Observable<IProduct[]> {
if (this.products) {
return of(this.products);
}
return this.http.get<IProduct[]>(this.productsUrl)
.pipe(
tap(data => console.log('All Products', JSON.stringify(data))),
tap(data => this.products = data),
catchError(this.handleError)
);
}
零件
this.productService.getProducts().subscribe({
next: (products: IProduct[]) => {
this.products = products;
},
error: err => this.errorMessage = err
});
在这里,如果数据已经被缓存,它使用 RxJSof
操作符将数据转换回 Observable。
这样您就可以订阅 getProducts 的结果,您将获得缓存的数据或检索到的数据。
注意:另一种选择是声明式地使用 RxJS 并利用 RxJSshareReplay(1)
运算符自动为您提供缓存。有关此技术的更多信息,请查看:https ://www.youtube.com/watch?v=Z76QlSpYcck&t=517s
推荐阅读
- r - 删除 R 中的行
- python - 使用 tkinter 在 GUI 中停止 gif
- html - 如何从常规 DIV 制作固定背景
- c# - RaspPi .net 使用 gpio(c# 和单声道)形成崩溃
- amazon-web-services - 在烧瓶应用程序中出现 403 禁止错误
- javascript - 如何在 React Native 中隐藏底部操作栏
- c++ - 我可以在命名空间中包含头文件吗?
- ssl - 自定义 OpenSSL 配置文件以使其与自定义引擎和 TLS v1.0 一起使用
- javascript - 通过数组 node.js 中的项目进行映射
- mongodb - 无法从 mongodb 驱动程序中获取任何文档