我通过返回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.
});
答案 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()
并查看是否可以解决问题。也许观察结果已经完成了。