angular - HTTP 错误处理如何与可观察对象一起工作?

标签 angular angular-http angular-observable

我看到很多教程都在做这样的事情:

http.get("...").subscribe(
  success => console.log('hello success'),
  error => console.log('bye error')
);

我不知道它是如何工作的,因为没有任何类型或任何东西,但是我自己尝试这样做,结果我的请求总是成功,即使我有一个错误。有什么问题?

麻烦制造者:

this.memberService.create(this.currentMember)
      .subscribe(
        success => {
          let mem: Member = success.json() as Member;
          if (this.selectedOrganization) {
            this.addMemberToOrganization(mem);
          } else if (this.selectedServiceProvider) {
            this.addMemberToServiceProvider(mem);
          } else {
            this.toastsService.error("lbl_users_service_provider_and_organization_undefined");
          }
        },
        error => console.log(error)
      );

成员服务中的创建方法:

  create(member: Member): Observable<any> {
    return this.http
      .post(this.RESOURCE_BASE_URL, member)
      .map(response => {
        if (response.status === 200) this.toastsSerivce.success(this.translateService.instant('lbl_users_member_created'));
        return response;
      })
      .catch(error => this.toastsSerivce.error(this.translateService.instant('lbl_users_member_create_failed')));
  }

我什至发现了错误,但 subscribe 部分似乎并不关心。 它在success.json()处失败了,因为如果出错,就没有json。但是如果出现错误,我希望它调用 error =>... 而不是 success。非常感谢任何建议。

最佳答案

我认为问题在于您没有使用Observable.throw(errMsg)throw错误

所以,你可以像这样使用它:

.catch((error:any) => Observable.throw(error.json().error || 'Server error'));

在你的例子中:

create(member: Member): Observable<any> {
    return this.http
      .post(this.RESOURCE_BASE_URL, member)
      .map(response => {
        if (response.status === 200) this.toastsSerivce.success(this.translateService.instant('lbl_users_member_created'));
        return response;
      })
      .catch((error:any) => Observable.throw(this.toastsSerivce.error(this.translateService.instant('lbl_users_member_create_failed'))));
  }

但是,您可以使用错误处理程序,就像 Angular 提议的那样 here :

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);
    return Observable.throw(errMsg);
  }

因此,您的方法看起来更像这样:

create(member: Member): Observable<any> {
    return this.http
      .post(this.RESOURCE_BASE_URL, member)
      .map(response => {
        if (response.status === 200) this.toastsSerivce.success(this.translateService.instant('lbl_users_member_created'));
        return response;
      })
      .catch(this.handleError);
  }

对于您可能在您的服务中创建的其他方法,它实际上更干净且更可重用。

我建议还使用一个响应处理程序,就像 Angular 开发人员使用的那样:this.extractData

显然,在错误处理方法中您可以放置​​自己的自定义逻辑,这取决于您希望如何显示或处理错误。

注意:我没有测试您的代码,也没有测试我在此处发布的代码。但我想展示/表达这个概念。 您应该抛出错误,以免每次都成功。您如何处理它取决于您和您的应用。

关于angular - HTTP 错误处理如何与可观察对象一起工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44385777/

相关文章:

html - Angular 2 - 变量更改时更新 View

angular - http 响应对象中没有方法

angular - 在 Angular 8 中订阅 Observable 组件时遇到问题

angular - 如何在azure中设置nodejs版本

javascript - Angularfire2 AngularFirestoreCollection 不发送集合中每个对象的键

javascript - 为什么 $httpProvider.interceptors 返回 `undefined` 值

Angular2 响应式表单和 BehaviorSubject

javascript - Angular 4 跳过链接

php - Angularjs $http get 方法不发送任何参数