当给出某个响应时,取消订阅Angular2方法?

时间:2017-04-24 15:40:33

标签: angular typescript rxjs

我试图了解当方法获得特定响应时如何取消订阅Angular2中的方法。

settings.component.ts

这是我的组件中有问题的方法,this.selectedBridge的值只是一个以IP地址作为值的字符串。

public connectToBridge() {
    this._hueService.connectToBridge(this.selectedBridge)
        .subscribe(bridgeResponse => { this.bridgeResponse = bridgeResponse });
}

bridgeresponse.model.ts

这是我在hue.service中映射的模型。

export interface BridgeResponse {
    error: Error;
    success: Success;
}

export interface Error {
    type: string;
    address: string;
    description: string;
}
export interface Success {
    username: string;
}

hue.service.ts

connectToBridge(bridgeIp) {
    return Observable.interval(2000).flatMap(() => {
        return this.http.post('http://localhost:54235/api/hue/ConnectToBridge',
                JSON.stringify(bridgeIp),
                { headers: this.headers })
            .map(response => <BridgeResponse>response.json());
    });

正如您所看到的,我正在使用一个observable来每2秒轮询一次API端点以检查响应是否已更改,是否有更好的方法可以做到这一点?基本上当模型内部的成功值不为空时,我想取消订阅该方法并停止每2秒轮询一次。

此外,正如我正在使用.NET Core和WebApi构建API的一些额外信息。

1 个答案:

答案 0 :(得分:3)

您可以使用takeWhile

  

public takeWhile(predicate: function(value: T, index: number): boolean): Observable<T>

     

只要每个值满足给定的谓词,就会发出源Observable发出的值,然后在不满足此谓词时立即完成。

connectToBridge(bridgeIp) {
    return Observable.interval(2000).switchMap(() => {
      return this.http.post('http://localhost:54235/api/hue/ConnectToBridge',
          JSON.stringify(bridgeIp), {
            headers: this.headers
          })
        .map(response => < BridgeResponse > response.json());
    }).takeWhile(data=>data.success===null);
}