2017-07-24 2 views
0

Fehlercodes unten behandeln: -Wie mehrere Fehlercode Szenario in HTTP-Anforderung

400 - single Wiederholungs auf Antwort Ankunft without delay

502, 503 und 504 führen eight Anzahl der Wiederholungen mit 1000 Sec delay

ausführen

Mein Code ist unten: -

private _getData('loginKey', body, headers) { 
return this._http.post('url', body, { headers: headers }) 
    .map((response: Response) => response.json()) 
    .retryWhen(errors => { 
    return errors 
     .mergeMap((error) => this.handleError(error)) 
     .delay(2000) 
     .take(8); 
    }); 
} 

public handleError(error: Response | any): Observable<any> { 
    if (error.status === 400) { // retry 1 time and with no delay 
    return Observable.of(error); 
    } else { // retry confgured times and configured delay 
    return Observable.of(error); 
    } 
} 

Mein Problem ist, wie man die obigen Fehlercodes nach delay und take Wert ändern:

wenn error.status ist dann delay value 0 und take value 1

wenn error.status502, 503 und 504 dann delay value 2000 und take value 8

+0

Wenn meine Antwort beantwortet Ihre Frage, die Sie es annehmen würde? –

+0

ja definitiv, wenn es hilfreich ist. –

+0

Ich habe meine Antwort –

Antwort

1

Der einfachste Weg, dies zu tun, ist eine Funktion in einem Service zu definieren, die re Drehe den gewünschten Wert.

Beispiel:

let errorStatus; 
private _getData('loginKey', body, headers) { 
return this._http.post('url', body, { headers: headers }) 
    .map((response: Response) => response.json()) 
    .retryWhen(errors => { 
    return errors 
     .mergeMap((error) => { 
      errorStatus = error.status; 
      this.handleError(error)) 
     }) 
     .delay(ResponseService.getDelay(errorStatus)) 
     .take(ResponseService.getRetries(errorStatus)); 
    }); 
} 

in ResponseService.js ...

function getDelay(status) { 
    let val = 0; 
    switch(status) { 
     case 400: 
      val = 0; 
      break; 
     ... 
    } 
    return val; 
} 

function getRetries(status) { 
    let val = 0; 
    switch(status) { 
     case 400: 
      val = 1; 
      break; 
     ... 
    } 
    return val 
} 
+0

aktualisiert, aber 'error.status' ist nicht zugänglich in' delay' und 'take' keine Ahnung, wie man darauf zugreifen kann. –

+1

Ich habe die Arbeit aktualisiert. Sie sollten in der Lage sein, den Wert des Fehlers zu erfassen, damit Sie ihn außerhalb des Bereichs der mergeMap verwenden können. –

+0

Ich habe versucht, Ihre Lösung, aber immer noch nicht auf 'Fehlerstatus' in' Verzögerung' und 'Take' zugreifen, weil dies zuvor anruft Der Code 'mergeMap' innerhalb des Codes wird ausgeführt. Also jede Lösung zu diesem Code oder jede alternative Lösung verfügbar. ** Bitte sehen Sie diesen Link: ** http://reactivex.io/rxjs/class/es6/Observable.js~Observable.html Ich habe nicht die vollständige Kenntnis von 'Observable verwendet' Ich habe eine verwendet Methode von diesem Link 'mergeMap',' delay' und 'take', so dass vielleicht jede alternative Lösung über diesen Link verfügbar ist. Bitte zeigen Sie mir, welchen Ansatz ich für diese Lösung verwende, wenn Sie es wissen. –