我正在使用Box API通过一个返回可观察值的服务来获取图像。当找不到图像时,可观察对象永远不会解析。当API被调用时,我显示了一个加载微调器。我希望观察值即使在没有结果的情况下也能解决,这样我就可以取消加载微调器。
我不想设置超时。
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.
});发布于 2018-01-26 10:04:04
订阅是异步的,因此只有在找到数据/没有错误的情况下才能访问它们;
如果你正在调用一个应用程序接口/服务来获取图像,http响应很快就会到达,无论是错误,空数据还是实际的空数据或图像的images.In情况,订阅下面的文本肯定是called.If,这不是空图像的情况,因为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 );
}发布于 2018-01-26 10:18:05
您必须确保您的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(),看看它是否有效。也许观察者正在被正确地完成。
https://stackoverflow.com/questions/48454738
复制相似问题