Как сбросить видимую ошибку вручную в angular2?

Я работаю над приложением angular2, в котором я делаю вызов отдыха через HTTp, как показано ниже:

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

В основном я хочу, чтобы мой компонент получил ответ и ошибку в моем подписном вызове.

то есть.

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

но мой api всегда возвращает успех, поскольку он определен таким образом.

Итак, я хочу знать, как я могу сбросить сообщение об ошибке, если response.success == 0, так что он будет доступен внутри аргумента ошибки моего обратного вызова для подписки.

Ответ 1

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

Изменить для rxjs 6:

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

Ответ 2

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

То, что вы ErrorObservable с ErrorObservable, зависит от вас

Ответ 3

rxjs 5

Либо

throw response;

или

throw Observable.throw(response);

Ответ 4

с rxjs 6

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

Ответ 5

Использовать оператор catch

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

И обработайте ошибку следующим образом:

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

Ответ 6

Большинство моих проблем было связано с импортом, поэтому вот код, который работал для меня...

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

Это будет решением, если вы сталкиваетесь с ошибками вроде...

ОШИБКА TypeError: WEBPACK_IMPORTED_MODULE_2_rxjs_Observable.Observable.throw не является функцией

Ответ 7

Обычно, когда вы выдаете ошибку, вы будете делать это в тот момент, когда возникла проблема, и вы захотите немедленно ее поднять, но это не всегда так.

Например, есть оператор timeoutWith(), который, возможно, является одной из наиболее вероятных причин, по которой вам нужно это сделать.

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

Это принимает "фабрику ошибок", которая является функцией.

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

например.

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

Обратите внимание, что при использовании timeoutWith вы никогда не получите реальный ответ сервера - поэтому, если сервер выдал конкретную ошибку, вы никогда ее не увидите. Этот пример выше может быть очень полезен при отладке, но убедитесь, что не отображаете ошибку конечному пользователю, если вы используете пример выше.

Фабрика ошибок полезна, потому что она не оценивает код, пока не произойдет фактическая ошибка. Таким образом, вы можете поместить "дорогие" или отладочные операции внутри, которые будут выполняться, когда ошибка действительно понадобится.

Если вам нужно использовать "фабрику", чтобы создать ошибку где-то, кроме времени ожидания, вы можете использовать следующее.

 EMPTY.pipe(throwIfEmpty(errorFactory)) 

Ответ 8

Вот официальный пример (номер 7, а затем ошибка "упс!"):

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

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