2017-02-13 4 views
0

Ich habe App, wo ich Funktion get() die mir Observable.interval(1000) mit http GET zurückgeben.Angular2 - GET 400 Deaktivieren meiner Observable Subscribe mit Intervall

In app.component Ich abonniere diese Observable und Drucken auf dem Bildschirm einige Werte von GET.

Alles funktioniert gut, bis die Get-Antwort 400 zurückgibt - der Server sendet 404 von Zeit zu Zeit - es ist normal. Aber wenn ich 400 bekomme, hört mein Abonnement auf zu arbeiten. Bildschirm zeigt nur letzte valuse und hier "erfrischend"

stoppen ist ein Code:

getAct(symbol:string): Observable<Act> { 

return Observable 
    .interval(1000) 
    .flatMap(() => { 
    return this.http.get(url) 
     .map((res: Response):Act => (res.json())) 
     .catch(err => { 
     return Observable.throw(err); 
     }); 
    }); 

}

Und hier ist Code, der abonnieren:

this.actSub = this.actService 
    .getAct(this.symbol) 
    .subscribe(
    act => { 
     console.log("ok"); 
     this.act = act;    
     } 
    }, 
    err => {console.warn(err);}, 
    ()=>console.log("Done") 
); 

Also, wenn ich Führen Sie meine App in der Konsole Ich habe dies: enter image description here

So läuft das Programm gut - 29 werden erfolgreich, aber wenn es 400 bekommt, stoppt es, und dort war kein "ok" mehr.

Wo ist das Problem? Ist mein getAct() falsch, oder kodiere ich etwas, wenn ich es abonniere?

Bitte helfen, ich habe versucht, das zu reparieren, aber ich konnte nicht.

+0

Dies ist ein normales Verhalten. Ein Observable stoppt den Wert, nachdem er abgeschlossen ist, oder Fehler (wie bei einer 4 ** HTTP-Antwort). – AngularChef

Antwort

1

Es gibt mehrere RxJS-Operatoren, die Fehler behandeln.

wäre am einfachsten retry() zu verwenden:

return this.http.get(url) 
    .retry() 
    .map(res => res.json()); 

Dies ist eine agressive Strategie, wie es auf den ursprünglichen beobachtbar (this.http.get(...)) sobald eine Anforderung nicht erneut abonnieren werden. Sie könnten den Server wirklich hart treffen.

Sie könnten wollen retryWhen() stattdessen verwenden, die Sie lassen eine leichte Verzögerung, bevor erneut versucht einzuführen, z.B .:

return this.http.get(url) 
    .retryWhen(errors => errors.delay(2000)) // 2-second delay before retrying 
    .map(res => res.json()); 
+0

jetzt ist es funktioniert exatcly ich will. Vielen Dank! –

+0

Gern geschehen, Maciej. :) – AngularChef

0

Ich kann so etwas machen, aber ich denke, es ist wirklich eine schlechte Lösung.

get(){ 
     this.actSub = this.actService 
      .getAct(this.symbol) 
      .subscribe(
      act => { 
       console.log("ok"); 
       this.act = act;    
       } 
      }, 
      err => { 
       console.warn(err); 
       this.get(); 
      }, 
      ()=>console.log("Done") 
     ); 
    } 
Verwandte Themen