webentwicklung-frage-antwort-db.com.de

Wie man einen beobachtbaren Fehler manuell in angle2 auslöst?

Ich arbeite an der angle2-App, in der ich über HTTp wie folgt einen Pausenanruf 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;
        }
    });
}

im Grunde möchte ich, dass meine Komponente eine Antwort und einen Fehler in meinem Abonnementanruf erhält.

d.h.

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 den erfolg zurück, wie er auf diese weise definiert wurde.

Ich möchte also wissen, wie ich Fehler msg werfen kann, wenn response.success == 0, damit auf das Fehlerargument meines abonnierten Rückrufs zugegriffen wird.

20
Bhushan Gadekar
if (response.success == 0) {
   throw Observable.throw(response);  
 } 
41
Jorawar Singh

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 ErrorObservable zurückgeben, liegt bei Ihnen

42
CapK

mit rxjs 6

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

rxjs 5

Entweder 

throw response;

oder

return Observable.throw(response);  // not working
5

Normalerweise machen Sie einen Fehler, wenn Sie einen Fehler werfen, und zwar in dem Moment, in dem das Problem aufgetreten ist, und Sie möchten den Fehler sofort beheben. Dies kann jedoch nicht immer der Fall sein. 

Zum Beispiel gibt es den Operator timeoutWith(), der wahrscheinlich einer der wahrscheinlichsten Gründe dafür ist.

results$ = server.getResults().pipe(timeoutWith(10000, ....) )

Dies erfordert eine "Fehlerfabrik", die eine Funktion ist.

 errorFactory = () => 'Your error occurred at exactly ' + new Date()

z.B.

results$ = server.searchCustomers(searchCriteria).pipe(timeoutWith(10000, 
              () => 'Sorry took too long for search ' + JSON.stringify(searchCriteria)) )

Beachten Sie, dass Sie bei Verwendung von timeoutWith nie die tatsächliche Serverantwort zurückbekommen. Wenn der Server einen bestimmten Fehler ausgegeben hat, wird er niemals angezeigt. Dieses Beispiel kann sehr hilfreich beim Debuggen sein. Stellen Sie jedoch sicher, dass Sie den Fehler nicht für den Endbenutzer anzeigen, wenn Sie das obige Beispiel verwenden.

Eine Fehler-Factory ist hilfreich, da der Code erst ausgewertet wird, wenn der tatsächliche Fehler auftritt. Sie können also "teure" oder Debugging-Vorgänge ausführen, die ausgeführt werden, wenn der Fehler tatsächlich benötigt wird.

Wenn Sie eine "Factory" verwenden müssen, um Ihren Fehler an einem anderen Ort als im Timeout zu erstellen, können Sie Folgendes verwenden.

 EMPTY.pipe(throwIfEmpty(errorFactory)) 
0
Simon_Weaver

Verwenden Sie den Fangoperator

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');
}
0
John Baird

Die meisten meiner Probleme bezogen sich auf die Importe, also hier der Code, der für mich funktionierte ...

import {_throw} from 'rxjs/observable/throw';
login(email, password) {
...
    return this.http.post(`${this._configService.getBaseUrl()}/login`, body, options)
    .map((res: any) => {
...
        if (response.success == 0) {
           _throw(response);  
        } else if (response.success == 1) {
...
        }
    });
}

Dies ist die Lösung, wenn Sie auf Fehler wie ...

ERROR TypeError: WEBPACK_IMPORTED_MODULE_2_rxjs_Observable . Observable.throw ist keine Funktion

0
Ajay