javascript - 可观察到的角度订阅返回未定义
问题描述
我的服务
import { Injectable } from "@angular/core";
import { Observable, of } from "rxjs";
import { SearchResult } from "../Components/container-search/Models/SearchResult";
import { environment } from "../../environments/environment";
import { HttpClient, HttpHeaders } from "@angular/common/http";
@Injectable({
providedIn: "root",
})
export class ContainerService {
constructor(public http: HttpClient) {}
private SearchResults: SearchResult[] = [];
public headers = {
headers: new HttpHeaders({
"Content-Type": "application/json",
}),
};
public Search(): Observable<SearchResult[]> {
if (this.SearchResults.length === 0) {
this.http
.get<SearchResult[]>(
environment.endpointURL + "/FooBar/Search",
this.headers
)
.subscribe((x) => {
this.SearchResults = x;
return of(this.SearchResults);
});
} else {
return of(this.SearchResults);
}
}
}
当我在组件中调用 Search() 时,它会返回
TypeError: Cannot read property 'subscribe' of undefined
我的调用代码是
ngOnInit(): void {
this.dataSource.paginator = this.paginator;
this.searchService.Search().subscribe((x) => {
this.dataSource = new MatTableDataSource<SearchResult>(x);
});
}
有人可以解释为什么这段代码this.searchService.Search()
总是会返回上述错误吗?
解决方案
该.subscribe
调用返回一个Observable
,但这不是该Search
方法返回的内容。订阅是一个异步过程。subscribe
启动该过程并仅在 http 调用返回时做出反应,但该方法Search
继续执行并返回未定义。
下面的代码将Observable
直接从 http 调用返回并解决您的问题。
import { tap } from 'rxjs/operators';
public Search(): Observable<SearchResult[]> {
if (this.SearchResults.length === 0) {
return this.http
.get<SearchResult[]>(
environment.endpointURL + "/FooBar/Search",
this.headers
).pipe(tap(x => this.SearchResults = x));
} else {
return of(this.SearchResults);
}
}
推荐阅读
- laravel - 与模型关联的权限,然后具有该模型的用户获得权限(laravel-permission)
- tcl - 如何在 proc (Tcl) 中使用内置变量
- python - 过滤数据框并将新创建的列添加到原始 df
- sql - SQL RANK 但如果相等则更高?
- html - 我怎样才能改变边界
- python - 无法识别的令牌:Django中的“@”
- javascript - JavaScript/Bootstrap noob - 想练习使用 Bootstrap 4 图表模板 - 在代码中缺少一些简单的东西
- javascript - 如何在反应中更新禁用字段的状态
- java - 如何在 servlet 中仅检索年份,同时从数据库中获取结果集
- git - 自动推送到远程 Github 存储库的脚本,不适用于 crontab?