我正在调用一个具有订户功能的函数。此函数必须返回一个数组,但是会出现错误:
缺少订阅。
{{1}}
如何实现?
答案 0 :(得分:0)
首先,如果要将映射从Observable返回的数据映射到其他内容,请将map()
operator传递到Observable的管道。像这样:
getSamples(): Observable<Cat[]>{
return this.http.get(this.url).pipe(map(response => { .... });
}
但是,如果get请求只是要返回Cat[]
数据,则不必映射它:
getSamples(): Observable<Cat[]>{
return this.http.get(this.url);
}
第二,如果您要激活从getSamples()
返回的Observable,subscribe()
而不是subscriber()
。
知道subscribe()
函数将返回您订阅的Observable的订阅,而不是它包含的数据的
从函数内部的可观察对象返回数据不是一个好方法,因为get()
是一个异步函数,它需要等待您的http请求首先完成才能返回正确的数据/错误。因此,更好的方法是在外部某个地方激活可观察对象,并将需要cat[]
数据的逻辑传递到其中:
ngOnInit() {
this.service.getsamples().subscribe(response => {
console.log(response)
// Do stuffs with respone data
},err =>{
console.log(err)
// Do things with error
});
}
答案 1 :(得分:-2)
简单的可观察设置类似于:
@Injectable()
export class SomeService {
constructor(private readonly httpClient: HttpClient) {}
public getData(): Observable<Cat[]> {
return this.httpClient.get<Cat[]>('http://something.com')
.pipe(catchError(err) => this.handleError(err));
}
private handleError(err: HttpErrorResponse): Observable<Cat[]> {
// do something
const result: Cat[] = [];
return of(result);
}
}
并连接到它:
@Component({...})
export class SomeComponent implements OnDestroy {
constructor(private readonly service: SomeService) {}
public doSomething(): void {
this.service.getData()
.subscribe((x: Cat[]) => {
alert(`Received ${x.length} cats`);
});
}
}
在某个时候,Angular HttpClient变得更聪明了,并且可以处理返回类型的映射,因此您可以制作自己的通用HttpService并进行一些描述并使用this.httpClient.get<T>(...)
,或者仅按使用情况使用如上所述,并确保您为方法this.httpClient.get<Cat[]>(...)
提供类型。