在app.component显示所有请求错误

发布于 2022-09-05 00:12:09 字数 2371 浏览 13 评论 0

有一个login.component,调用了login.service里的login方法,这个login又调用了util.service里的basePost方法,basePost是我封装的用来发送http请求的方法,当请求handle到错误的时候需要把错误信息让根组件app.component可以接收到.

我目前用BehaviorSubject,但是每次只有在页面首次初始化app.component的时候才会进入subscribe里面并赋值给errMsg参数,以后虽然调用到this.errSubject.next(errMsg);添加错误信息,但是app.component里都订阅不到errSubject。

util.service.ts:

  public basePost(postUrl: string, body?: any): Observable<any> {

    errSubject: BehaviorSubject<any> = new BehaviorSubject<any>('');
    const headers = new Headers({'Content-Type': UtilService.CONTENT_TYPE});
    const options = new RequestOptions({headers: headers});

    if (!body) {
      body = null;
    }

    return this.http.post(this.API_HOST + postUrl, body, options)
      .map(res => {
        return this.extractData(res);
      })
      .catch(error => {
        return this.handleError(error);
      });
  }

  private handleError(error: Response | any) {
    // In a real world app, you might use a remote logging infrastructure
    let errMsg: string;
    if (error instanceof Response) {
      const body = error.json() || '';
      const err = body['error'] || JSON.stringify(body);
      errMsg = `${error['status']} - ${error['statusText'] || ''} ${err}`;
    } else {
      errMsg = error['message'] ? error['message'] : error.toString();
    }
    console.error(errMsg);
    this.errSubject.next(errMsg);
    this.errmsg = errMsg;
    return Observable.throw(errMsg);
  }

login.service.ts:

export class LoginService extends UtilService {

  constructor(public http: Http, public router: Router) {
    super(http, router);
  }
}

  /**
   * login
   * @param body
   * @returns {Observable<any>}
   */
  login(body: any): Observable<any> {
    return super.basePost('&m=LoginSupplier&a=Login', body);
  }

app.component.ts:

  errMsg = '';

  constructor(private utilService: UtilService) {
    
  }

  ngOnInit() {
    this.utilService.getMessage()
      .subscribe(data => {
        this.errMsg = data;
      });

app.component.html:

<div class="app-tips" *ngIf="errMsg">
  <alert type="danger" dismissible="true">
    {{errMsg}}
  </alert>
</div>
<router-outlet></router-outlet>

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

千里故人稀 2022-09-12 00:12:09

你在LoginService的errSubject上调用next,却想在UtilService的errSubject上订阅到,显然是不可能的
虽然LoginService继承自UtilService,但它们并不是同一个实例
如果想在UtilService上订阅,你应该在LoginService里注入UtilService,而不是继承UtilService

export class LoginService {
  constructor(public http: Http, public router: Router, private utilService: UtilService) {
  }
  login(body: any): Observable<any> {
    return this.utilService.basePost('&m=LoginSupplier&a=Login', body);
  }
}
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文