【发布时间】:2016-10-18 12:08:17
【问题描述】:
在Observable.timer(0, 1000) 的帮助下,我正在以定义的时间模式向我的服务器发出连续请求。在我处理完响应的内容后,可能在特殊情况下并且取决于之前的响应,我需要删除响应,因此不要将其传递给服务的订阅者:
@Injectable()
export class LoggerService {
constructor(private http: Http) { }
private apiURL = 'assets/file.json';
getList() {
return Observable.timer(0, 1000)
.concatMap(() => this.http.get(this.apiURL))
.map(this.extractData)
.catch(this.handleError););
}
private extractData(res: Response) {
var fooot = new Foo();
fooot.fillFromJSON(JSON.stringify(res.json()));
if(fooot.getProperty()){
//DROP IT
}
return fooot;
}
private handleError(error: any) {
let errMsg = (error.message) ? error.message :
error.status ? `${error.status} - ${error.statusText}` : 'Server error';
console.error(errMsg);
return Observable.throw(errMsg);
}
}
然后从组件的ngOnInit 调用getList() 方法。
目前我能想到两种可能的解决方案,购买也许有更好/更清晰的方法来解决这个问题:
如果我必须放弃响应,我会创建一个特殊对象,该对象被
getList()的订阅者识别,然后进行专门处理。但是这个解决方案会非常难看,因为丢弃的响应会离开我的服务,我需要在服务之外额外编写代码来处理这种情况。当我不得不放弃响应时,我抛出了一个异常。然后异常被捕获,识别(与其他情况不同),然后在没有任何通知/输出的情况下丢弃。之后,observable 重新启动。这种方法的优点是应该丢弃的 observable 不会离开服务,但我不喜欢在这种情况下对控制流使用异常。
我尝试了这两种解决方案,它们都有效,但我希望有更好的方法。
【问题讨论】:
标签: angular typescript rxjs5