如何解决如何返回来自响应的数据?
我有一个服务,首先执行getName函数,然后当一些数据进入getPlace函数的else块中,而不是常规对象时,我得到一个订阅者(如您在屏幕快照中所见),尽管从理论上讲,我赞成在赋值的地方进行更改。它可以解决?
解决方法
正如其他人所说,您不能将http请求(http.get)视为过程代码。 http请求是异步的,并且.pipe()
方法中的代码仅在 从服务器返回数据后执行。
因此,您的getPlace()
方法将无法通过调用data
方法简单地返回_getPlace()
。
与其对抗这种工作方式,而是试图“修复”它。我建议您将两者都视为Observable。
我在类似情况下的代码如下:
服务
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
});
在这里,如果数据已经被缓存,它将使用RxJS of
运算符将数据转换回Observable。
这样,您可以订阅getProducts的结果,就可以获取缓存的数据或获取的数据。
注意:另一个选择是声明式使用RxJS并利用RxJS shareReplay(1)
运算符自动为您提供缓存。有关此技术的更多信息,请查看以下内容:https://www.youtube.com/watch?v=Z76QlSpYcck&t=517s
您必须订阅获取值的功能
django.core.management.base.SystemCheckError: SystemCheckError: System check identified some issues:
ERRORS:
<class 'modules.teacher.admin.TeacherInline'>: (admin.E202) 'users.User' has no ForeignKey to 'teacher.Teacher'.
,
可观察到的是异步的,而javascript使用单线程环境。 如果javascript线程检测到任何异步任务,则将该任务交给封闭的环境(浏览器等),以在单独的线程中执行该任务。 因此,您的代码将像这样运行。
- 主线程调用this._getPlace()
- 检查语句this._getPlace()并将执行移交给其他线程。
- 主线程返回数据变量(为null)-这发生在步骤2完成之前。
这就是为什么返回的数据为null。
要解决您的问题,请使用map
代替subscribe
if(this._place.has(placeId)){
return this._places.get(placeId)
} else {
let data: any = this.getPlace(placeId).map( place => {
//do something here
//return something
}).first()
return data;
}