【问题标题】:Unsubscribing from an Angular2 method when a certain response is given?给出特定响应时退订Angular2方法?
【发布时间】:2017-10-06 20:10:52
【问题描述】:

我正试图弄清楚如何在 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 的一些额外信息一样。

【问题讨论】:

  • 您还需要在ngOnDestroy() 中取消订阅。 This post 有一个比直接取消订阅更好的选择来取消订阅。

标签: angular typescript rxjs


【解决方案1】:

你可以使用takeWhile

public takeWhile(predicate: function(value: T, index: number): boolean): Observable&lt;T&gt;

只要每个值都满足给定的谓词,就发出源 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);
}

【讨论】:

  • 第一个请求在 2 秒之后可以吗?
猜你喜欢
  • 1970-01-01
  • 2016-01-16
  • 2014-03-14
  • 2013-05-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-14
相关资源
最近更新 更多