web-dev-qa-db-fra.com

Comment jeter une erreur observable manuellement dans angular2?

Je travaille sur l'application angular2 dans laquelle je fais un appel de repos via HTTp comme ci-dessous:

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

en gros, je veux que mon composant reçoive une réponse et une erreur lors de mon appel d'abonnement.

c'est à dire.

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

mais mon api retourne toujours le succès tel qu'il est défini de cette façon.

Je veux donc savoir comment lancer une erreur msg si response.success == 0, afin qu’elle soit accessible dans l’argument d’erreur de mon rappel subscribe.

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

Ce que vous retournez avec ErrorObservable dépend de vous

42
CapK

avec rxjs 6

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

rxjs 5

Non plus 

throw response;

ou

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

Habituellement, lorsque vous générez une erreur, vous le faites au moment précis où le problème est survenu et vous souhaitez le signaler immédiatement, mais cela peut ne pas toujours être le cas. 

Par exemple, il y a l'opérateur timeoutWith(), qui est peut-être l'une des raisons les plus probables pour lesquelles vous devez le faire.

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

Cela prend une "fabrique d'erreur", qui est une fonction.

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

par exemple.

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

Notez que lorsque vous utilisez timeoutWith, vous ne recevrez jamais la réponse réelle du serveur. Par conséquent, si le serveur donnait une erreur spécifique, vous ne la verriez jamais. Cet exemple ci-dessus peut être très utile pour le débogage, mais veillez à ne pas afficher l'erreur à l'utilisateur final si vous utilisez l'exemple ci-dessus.

Une fabrique d’erreurs est utile car elle n’évalue pas le code tant que l’erreur réelle n’est pas apparue. Vous pouvez donc insérer à l'intérieur des opérations «coûteuses» ou de débogage qui seront exécutées lorsque l'erreur sera finalement nécessaire.

Si vous devez utiliser une "usine" pour créer votre erreur ailleurs que dans timeout, vous pouvez utiliser les éléments suivants.

 EMPTY.pipe(throwIfEmpty(errorFactory)) 
0
Simon_Weaver

Utiliser l'opérateur de capture

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

Et gérer l'erreur comme ceci:

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

La plupart de mes problèmes étaient liés aux importations, alors voici le code qui a fonctionné pour moi ...

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

Ce sera la solution si vous faites face à des erreurs comme ...

ERREUR TypeError: WEBPACK_IMPORTED_MODULE_2_rxjs_Observable . Observable.throw n'est pas une fonction

0
Ajay