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.
if (response.success == 0) {
throw Observable.throw(response);
}
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
avec rxjs 6
import { throwError } from 'rxjs';
throwError('hello');
rxjs 5
Non plus
throw response;
ou
return Observable.throw(response); // not working
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))
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');
}
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