我试图了解当方法获得特定响应时如何取消订阅Angular2中的方法。
这是我的组件中有问题的方法,this.selectedBridge的值只是一个以IP地址作为值的字符串。
public connectToBridge() {
this._hueService.connectToBridge(this.selectedBridge)
.subscribe(bridgeResponse => { this.bridgeResponse = bridgeResponse });
}
这是我在hue.service中映射的模型。
export interface BridgeResponse {
error: Error;
success: Success;
}
export interface Error {
type: string;
address: string;
description: string;
}
export interface Success {
username: string;
}
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的一些额外信息。
答案 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);
}