如何在angular2中手动抛出可观察的错误?

时间:2016-11-09 16:41:47

标签: javascript angular typescript angular2-observables

我正在开发angular2 app,我正在通过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抛出错误信息,以便在我的订阅回调的错误参数内访问它。

8 个答案:

答案 0 :(得分:54)

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返回的内容取决于您

答案 1 :(得分:45)

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

答案 2 :(得分:7)

使用rxjs 6

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

答案 3 :(得分:5)

rxjs 5

要么

throw response;

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

答案 4 :(得分:0)

使用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');
}

答案 5 :(得分:0)

我的大多数问题都与导入有关,所以这是对我有用的代码...

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不是函数

答案 6 :(得分:0)

通常,当您引发错误时,您会在出现问题的确切时间这样做,并希望立即提出问题,但这并非总是如此。

例如,有一个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)) 

答案 7 :(得分:0)

这是官方示例(发出数字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