在Angular 5中解析observable而没有结果

时间:2018-01-26 01:50:15

标签: angular observable angular2-observables

我通过返回Observable的服务使用Box API获取图像。当没有找到图像时,Observable永远不会解析。在调用API的时候,我正在显示一个加载微调器。我希望Observable即使没有结果也能解决,所以我可以解除加载微调器。

我宁愿不设置超时。

BoxService:

getProjectImages(projectId: string, featured?: boolean, thumbnail?: boolean) {
    const featuredFlag = (featured !== undefined ? (featured ? flag.YES : flag.NO) : undefined);
    const thumbnailFlag = (thumbnail !== undefined ? (thumbnail ? flag.YES : flag.NO) : undefined);
    return this.search(projectId, featuredFlag, thumbnailFlag)
            .map(files => Observable.of<FileInfo>(...files)) // for each box file create an observable
            .concatAll() // flatten Observable<Observable<FileInfo>> to Observable<FileInfo>
            .map(f => this.getRepresentations(f.id)) // For each FileInfo get it's Representation
            .concatAll(); // flatten Observable<Observable<FileRepresentation>>
}

组件:

this.boxService.getProjectImages(String(project.projectId), true, false)
    .catch(err => observer.error(err))
    .subscribe((image: FileRepresentation) => {

        // hide loading spinner
        // If images are found, display images.
        // Currently, this is only reached if images are found.

    });

2 个答案:

答案 0 :(得分:0)

订阅是异步的,因此只有在找到数据/没有错误时才会到达;

如果您正在调用api / service来获取图像,http响应将很快到达,包含错误,空数据或实际图像。如果数据空白或图像空白,您的订阅下面的文本肯定会被调用。如果那不是空图像的情况,因为http响应返回错误,你没有捕获或你对返回数据的操作不正确。

示例:

getImages():Observable<Images[]>{
     return this._http.get(this.getImagesURL)
     .catch( this.handleError );
 }

private handleError( error: any ) {
    if ( error instanceof Response ) {//Backend Error
        //.json() parsing failed from server
        console.log( "Error:"+error.text() );
        return Observable.throw( error.text() );
    }
    //otherwise the server returned error code status
    return Observable.throw( error );
}

  this.dataService.getImages().subscribe(data=>{
      console.log("Response has arrived it may be empty");
  }),
  error=>{
      console.log( "ERROR:" + error );
  }

答案 1 :(得分:0)

您必须确保您的observable 完成,以便调用finally运算符。您可以使用finally运算符在流完成后执行回调。

this.boxService.getProjectImages(String(project.projectId), true, false)
.catch(err => observer.error(err))
.finally(()=> { /** turn off loading indicator **/ })
.subscribe((image: FileRepresentation) => {
});

我不清楚你是如何创造观察者的。你调用this.search()方法返回一个observable,但这是一个无限的观察者吗?

如果永远不会调用complete()方法,或者您没有完成流的操作员。只要有订阅者,它将无限期地保持开放。

您可以使用take(#)first()等运算符在一些项目发布后自动完成一个可观察项。

我需要了解this.search()如何提供更好的答案,但首先尝试使用finally()并查看是否可以解决问题。也许观察结果已经完成了。