首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >解析Angular 5中的observable,但没有结果

解析Angular 5中的observable,但没有结果
EN

Stack Overflow用户
提问于 2018-01-26 09:50:15
回答 2查看 1.6K关注 0票数 2

我正在使用Box API通过一个返回可观察值的服务来获取图像。当找不到图像时,可观察对象永远不会解析。当API被调用时,我显示了一个加载微调器。我希望观察值即使在没有结果的情况下也能解决,这样我就可以取消加载微调器。

我不想设置超时。

BoxService:

代码语言:javascript
复制
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>>
}

组件:

代码语言:javascript
复制
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.

    });
EN

回答 2

Stack Overflow用户

发布于 2018-01-26 10:04:04

订阅是异步的,因此只有在找到数据/没有错误的情况下才能访问它们;

如果你正在调用一个应用程序接口/服务来获取图像,http响应很快就会到达,无论是错误,空数据还是实际的空数据或图像的images.In情况,订阅下面的文本肯定是called.If,这不是空图像的情况,因为http响应返回的错误是你没有捕捉到的错误,或者你对返回数据的操作是不正确的。

示例:

代码语言:javascript
复制
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 );
  }
票数 0
EN

Stack Overflow用户

发布于 2018-01-26 10:18:05

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

代码语言:javascript
复制
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(),看看它是否有效。也许观察者正在被正确地完成。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48454738

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档