【问题标题】:How to drop the response of an Observable如何删除 Observable 的响应
【发布时间】: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() 方法。 目前我能想到两种可能的解决方案,购买也许有更好/更清晰的方法来解决这个问题:

  1. 如果我必须放弃响应,我会创建一个特殊对象,该对象被getList() 的订阅者识别,然后进行专门处理。但是这个解决方案会非常难看,因为丢弃的响应会离开我的服务,我需要在服务之外额外编写代码来处理这种情况。

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

我尝试了这两种解决方案,它们都有效,但我希望有更好的方法。

【问题讨论】:

    标签: angular typescript rxjs5


    【解决方案1】:

    如果我理解正确,您正在寻找switchMap 运算符。

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

    更新:

    如果您希望手动取消 HTTP 请求,您必须创建一个 cancelSubject: Subject 并在 HTTP 请求上定义一个 takeUntil(cancelSubject)

    要取消 HTTP 请求,只需调用 cancelSubject.next(true),这反过来会取消 HTTP 请求,因为 takeUntil 生效。

    请记住,一秒钟后,请求将重新启动。如果要取消计时器,则必须将 .takeUntil(cancelSubject) 放在外部 observable 上。

    【讨论】:

    • 我不想停止一个http请求,我只想忽略/丢弃它的响应。
    【解决方案2】:

    我最终使用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);
      }
    

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

    这种方法的一个缺点是响应必须被解析两次,但我想这是无法避免的。很高兴知道 json 方法是否比结果(正文)的完整字符串比较快。

    如果放弃回复的决定仅取决于当前回复,我建议使用filter

    【讨论】:

      猜你喜欢
      • 2023-04-03
      • 1970-01-01
      • 2011-12-15
      • 1970-01-01
      • 2021-02-17
      • 2021-07-26
      • 2015-04-25
      • 2019-11-01
      • 1970-01-01
      相关资源
      最近更新 更多