Wie kann man einen beobachtbaren Fehler manuell auslösen?

Lesezeit: 4 Minuten

Benutzer-Avatar
Bhushan Gadekar

Ich arbeite an einer Angular-App, in der ich wie folgt einen Restanruf über HTTP tätige:

login(email, password) {
    let headers = new Headers();
    headers.append('Content-Type', 'application/x-www-form-urlencoded');
    let options = new RequestOptions({ headers: headers });
    let body = `identity=${email}&password=${password}`;
    return this.http.post(`${this._configService.getBaseUrl()}/login`, body, options)
    .map((res: any) => {
        let response: any = JSON.parse(res._body);
        if (response.success == 0) {
          Observable.throw(response);  // not working
        } else if (response.success == 1) {
          console.log('success');
          localStorage.setItem('auth_token', 'authenticated');
          this.loggedIn = true;
          return response;
        }
    });
}

Grundsätzlich möchte ich, dass meine Komponente in meinem Abonnementaufruf eine Antwort und einen Fehler erhält, dh

this._authenticateService.login(this.loginObj['identity'],this.loginObj['password']).subscribe(
  (success)=>{      
    this.credentialsError=null;  
    this.loginObj={};  
    this._router.navigate(['dashboard']);    
  },
  (error)=>{
    console.log(error);        
    this.credentialsError=error;     
  }
);

aber meine API gibt immer Erfolg zurück, wie es so definiert ist.

Wie kann ich eine Fehlermeldung ausgeben, wenn response.success == 0damit innerhalb des Fehlerarguments meines Abonnement-Callbacks darauf zugegriffen wird?

  • Was ist der Statuscode, den Sie bekommen, ich meine, es kann auch anders als 0 sein?

    – Jorawar Singh

    9. November 2016 um 16:58 Uhr

  • @MrJSingh, der Typ, der die API entworfen hat, hat nur Erfolg als 0 oder 1 zurückgegeben, um die Antwort zu validieren. Also war meine Operation erfolgreich, es wird Erfolg = 1 oder Erfolg = 0 zurückgegeben. Jetzt möchte ich einen Fehler auslösen, wenn der Erfolg erfolgreich ist 0.ist das möglich?

    – Bhushan Gadekar

    9. November 2016 um 17:02 Uhr

  • Lassen Sie mich meine App ausprobieren, technisch sollte es möglich sein.

    – Jorawar Singh

    9. November 2016 um 17:03 Uhr

  • versuchen Sie diese Rückkehr Observable.throw (Antwort);

    – Jorawar Singh

    9. November 2016 um 17:12 Uhr

  • Sie können dies versuchen: Es ist ein ähnlicher Fall stackoverflow.com/a/55286461/8342681

    – Javier Solis Guzman

    21. März 2019 um 17:57 Uhr

Benutzer-Avatar
Jorawar Singh

if (response.success == 0) {
   throw Observable.throw(response);  
 } 

Bearbeiten für rxjs 6:

if (response.success == 0) {
   throw throwError(response);  
 } 

  • Ich bekomme es erfolgreich zurückgerufen, auch wenn ich es nicht benutze

    – Bhushan Gadekar

    9. November 2016 um 17:17 Uhr

  • Ich verstehe nicht, was meinst du, auch wenn du es nicht benutzt? kannst du es mir erklären? Ich habe es so getestet, wie Sie den Fall haben, und Observable wird nur dann einen Fehler auslösen, wenn der Erfolg 0 ist.

    – Jorawar Singh

    9. November 2016 um 17:24 Uhr

  • Ich meine, wenn meine Antwort irgendetwas zurückgibt, sei es ein Fehler oder ein Erfolg, wird sie immer in einen Erfolgs-Callback zurückgegeben. Ich möchte, dass ein Fehler im Fehler-Callback ausgelöst wird.

    – Bhushan Gadekar

    9. November 2016 um 17:26 Uhr

  • Diese Antwort ist veraltet.

    – Slawa Fomin II

    20. Juni 2018 um 17:28 Uhr

  • Dadurch wird ein Observable im Fehlerrückruf zurückgegeben, was kein gutes Codedesign ist. Werfen Sie stattdessen einfach Ihr eigenes Fehlerobjekt aus throw { message: 'Bad response', value: response}

    – frido

    16. Juli 2019 um 10:25 Uhr

Benutzer-Avatar
Kristjan Liiva

rxjs 6

import { throwError } from 'rxjs';

if (response.success == 0) {
  return throwError(response);  
}

rxjs 5

import { ErrorObservable } from 'rxjs/observable/ErrorObservable';

if (response.success == 0) {
  return new ErrorObservable(response);  
}

Was Sie mit zurückbringen ErrorObservable liegt an Ihnen

  • Die akzeptierte Antwortlösung ist in rxjs6 veraltet. Danke, deins funktioniert 🙂

    – grünn

    23. Juli 2018 um 14:43 Uhr

  • Dies ist der richtige Weg, wenn er innerhalb eines Operators verwendet wird, von dem erwartet wird, dass er ein Observable like zurückgibt switchMap oder mergeMap. Bei innerer Verwendung map Sie erhalten am Ende ein verschachteltes Observable (Sie erhalten ein Observable im Erfolgsrückruf Ihres Observable), was wahrscheinlich nicht das ist, was Sie wollen.

    – frido

    16. Juli 2019 um 10:34 Uhr

mit rxjs 6

import { throwError } from 'rxjs';
throwError('hello');

  • Bitte erklären Sie, warum das besser ist als der native Teil der Sprache, dh der throw Stichwort?

    – Endrju

    7. November 2018 um 2:25 Uhr

  • @Endrju es ist ganz anders. return throwError gibt Observable zurück, das Sie dann mit catchError oder inside subsribe behandeln können. Wenn Sie einen neuen Fehler (”) werfen, sprudelt dies und wird nicht in Observables behandelt …

    – pajics

    15. März 2019 um 23:32 Uhr

  • Einfach anrufen throwError hat bei mir nicht funktioniert.

    – Doug Domeny

    10. Februar 2021 um 22:00 Uhr

Benutzer-Avatar
Günter Zöchbauer

rxjs 5

Entweder

throw response;

oder

throw Observable.throw(response);

Benutzer-Avatar
Sinissa Rudan

Hier ist das offizielle Beispiel (das die Nummer 7 und dann den Fehler „oops!“ ausgibt):

import { throwError, concat, of } from 'rxjs';

const result = concat(of(7), throwError(new Error('oops!')));
result.subscribe(x => console.log(x), e => console.error(e));

Aus:
https://rxjs-dev.firebaseapp.com/api/index/function/throwError

Benutzer-Avatar
Faouzi Chabchoub

rxjs 7

throwError(() => new Error(response))

Mehr Info
https://rxjs.dev/deprecations/breaking-changes#throwerror

Benutzer-Avatar
John Baird

Verwenden Sie den Catch-Operator

this.calcSub = this.http.post(this.constants.userUrl + "UpdateCalculation", body, { headers: headers })
   .map((response: Response) => {
      var result = <DataResponseObject>response.json();
         return result;
   })
   .catch(this.handleError)
   .subscribe(
      dro => this.dro = dro,
      () => this.completeAddCalculation()
   );

Und behandeln Sie den Fehler wie folgt:

private handleError(error: Response) {
    console.error(error); // log to console instead
    return Observable.throw(error.json().error || 'Server Error');
}

  • meine api ruft nie catch block auf. das ist das Problem, das ich habe. In meiner Antwort möchte ich auf bestimmte Bedingungen prüfen und dann den Fehler auslösen oder den catch-Block aufrufen.

    – Bhushan Gadekar

    9. November 2016 um 16:57 Uhr

  • Ich habe diesen Fehler mit privatem handleError(error: Response) erhalten WEBPACK_IMPORTED_MODULE_2_rxjs_Observable.a.throw ist keine Funktion bei CatchSubscriber.selector

    – Nam Le

    8. Januar 2018 um 9:29 Uhr


  • @NamLe Sie müssen throw importieren, um es verwenden zu können. import 'rxjs/add/observable/throw';

    – SuffPanda

    12. März 2018 um 14:13 Uhr


1185760cookie-checkWie kann man einen beobachtbaren Fehler manuell auslösen?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy