angular - Dezabonarea de la o metodă Angular2 când este primit un anumit răspuns?


Încerc să înțeleg cum pot să mă dezabonez de la o metodă în Angular2 atunci când metoda primește un anumit răspuns.

settings.component.ts

Aceasta este metoda în cauză din componenta mea, valoarea lui this.selectedBridge este doar un șir de caractere cu o adresă IP ca valoare.

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

bridgeresponse.model.ts

Acesta este modelul la care fac mapare în interiorul serviciului meu hue.

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

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

hue.serviciu.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());
    });

După cum puteți vedea, folosesc un observable pentru a interoga endpoint-ul API la fiecare 2 secunde pentru a verifica dacă răspunsul s-a schimbat, există o modalitate mai bună de a face acest lucru? Practic, când valoarea lui success din interiorul modelului nu este nulă, vreau să mă dezabonez de la metodă și să opresc interogarea la fiecare 2 secunde.

De asemenea, doar ca informație suplimentară, folosesc .NET Core și WebApi pentru a construi API-ul.

Răspuns #1

Poți folosi takeWhile :

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

Emite valorile emise de Observable-ul sursă atâta timp cât fiecare valoare satisface predicatul dat și apoi se încheie imediat ce acest predicat nu mai este satisfăcut.

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