2016-10-18 42 views
3

Observable.timer(0, 1000)的帮助下,我正在以定义的时间模式向我的服务器发出连续请求。如何删除Observable的响应

@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); 
    } 
} 

的:经过我处理的响应的内容是特殊条件和根据之前的响应,我需要删除的响应,因此不要将其传递给服务的用户下是可能的getList()方法然后从一个组件调用ngOnInit。 目前有两种可能的解决方案,我能想到的,买也许有解决这个问题的一个更好/更清晰的做法:如果我不得不放弃我创建了一个特殊对象的响应这是公认

  1. getList()的用户再进行具体处理。但是这个解决方案会非常难看,因为丢弃的响应会离开我的服务,我需要额外编写代码以外的代码来处理这种情况。

  2. 当我不得不放弃响应时,我抛出异常。然后,异常被捕获,被识别(与其他情况不同),然后在没有任何通知/输出的情况下丢弃。之后,可观测值重新启动。这种方法的优点是应该放弃的观测值不会离开服务,但我不喜欢在这种情况下控制流的异常使用情况。

我尝试了两种解决方案,他们都在工作,但我希望有一些更好的方法。

回答

1

我结束了使用distinctUntilChanged存档我的目标:

getList() { 
    return Observable.timer(0, 1000) 
     .concatMap(() => this.http.get(this.apiURL) 
     .distinctUntilChanged(null, x => x.json().info[1].value) 
     .map(this.extractData) 
     .catch(this.handleError); 
    } 

因此,如果当前和最后响应共享相同的特定值,最新的响应被丢弃。我想我的问题还不够清楚,我没有提到放弃答复的决定取决于前一个答案。

A 缺点这种方法是响应必须被解析两次,但我想这是无法避免的。这将是很好的知道,如果JSON接近比结果(主体)的完整字符串比较更快。

如果决定放弃答复只取决于当前的答案,我会建议使用filter

1

如果我理解正确,您正在寻找switchMap运营商。

如果在1秒(指定的时间间隔)内没有响应到达,则HTTP请求将被静默取消,另一个将启动。

更新:

如果您正在寻找手动取消HTTP请求,你必须创建一个cancelSubject: Subject并定义在HTTP请求takeUntil(cancelSubject)

要取消HTTP请求,您只需拨打cancelSubject.next(true),这又会取消HTTP请求,因为takeUntil生效。

请记住,在一秒钟后,请求将被重新启动。如果要取消计时器,则必须将.takeUntil(cancelSubject)置于外部可观察位置。

+0

我不想停止一个http请求,我只想忽略/放弃它的响应。 – Akkusativobjekt