如何从角度获取用户函数的返回值?

时间:2019-08-07 21:37:50

标签: angular rxjs

我正在调用一个具有订户功能的函数。此函数必须返回一个数组,但是会出现错误:

  

缺少订阅。

{{1}}

如何实现?

2 个答案:

答案 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[]>(...)提供类型。