【问题标题】:What is the benefit of using observable in Angular 5 http requests?在 Angular 5 http 请求中使用 observable 有什么好处?
【发布时间】:2018-04-17 18:42:59
【问题描述】:

我对在 Angular 5 中使用 httpclient 感到困惑。我是 Angular 新手,只是遵循官方 Angular 教程。我对 observables、promise、pipe 等了解不多。目前我有一项服务来处理所有 http方法。对于我使用管道的发布请求。下面是方法。

create(model: any,URI) :Observable<Object>{
    return this.http.post(API_URL+URI, model)
    .pipe(
        catchError(this.handleError('create', model))
    );
}



private handleError<T> (operation = 'operation', result?: T) {
        return (error: any): Observable<T> => {

        console.error("default"+error); // log to console instead
        var errors=error["error"];

        var type=errors.errors;

        this.log(`${operation} failed: ${JSON.stringify(errors.errors)}`);

        return of(result as T);
        };
    }

      private log(message: string) {
        this.messageService.add('DataService: ' + message);
      }

在组件内部,我像这样调用这个创建方法..

onSubmit() { 
        this.loading = true;
        this._dataService.create(this.model,companytype_url).subscribe(data => {
            console.log("inside component data type-company"+JSON.stringify(data));
        },
        error=>{
            var error_data=JSON.stringify(error);
            console.log("inside component error type-company ->" + error_data)
        }
        );
        this.submitted = true;
        this.loading = false;
        this.companytypeForm.reset();
    }

我应该在组件中使用订阅吗? 我需要一个通用的 http 类来处理所有的 api 请求。它是一个大型应用程序并且有很多组件。由于我是 Angular 新手,我对调用 http 方法的不同方式感到困惑。

【问题讨论】:

  • @DeborahK 请检查这个..

标签: angular rxjs angular5 rxjs5


【解决方案1】:

我应该在组件中使用订阅吗?

是的。如果您不订阅,则不会向服务器发送任何内容

我需要一个通用的 http 类来处理所有的 api 请求

这就是 HttpClient。如果您的服务是完全通用的,它不会向 HttpClient 已经提供的内容添加任何内容。使用专用服务,它实际上提供了更高级别的抽象:具有类型化参数、必要的转换输入、使用适当的 URL、返回类型化对象、知道如何转换响应等。

由于我是 Angular 新手,我对调用 http 方法的不同方式感到困惑。

这就是 Angular 提供...文档的原因。例如,这个HttpClient guide 和这个RxJS guide。阅读它们。

【讨论】:

  • 谢谢..我还有一个疑问。当发生错误时,catchError 起作用,并且 handleError 被执行。但是,当我订阅并在订阅中放置另一个错误处理函数时,即使发生错误,该函数也永远不会执行。每当收到数据时,console.log("inside component data type-company"+JSON.stringify(data)) 将被执行,即使发生错误。
  • 那是因为您在服务中的错误处理程序(大多数情况下是无用的)没有按照应有的方式重新抛出错误。你还没有发布它,所以...
  • 无用的意思是......我应该从服务中删除那个错误处理程序?
  • 我不知道,因为你没有发布它,你也没有说明为什么要添加它。所以我不知道它的作用,也不知道为什么你认为它有用。
  • 如果您需要一个有用的错误处理程序(例如,向用户显示实际的通用错误消息),请使用 HTTP 拦截器,如文档中所述。在任何情况下,如果您选择继续使用这样的处理程序,它应该返回Observable.throw(error),以将错误传播给调用者。请注意,无论错误是什么(包括,例如,无法发送请求,在这种情况下您肯定不会有 JSON 响应),都会调用处理程序
猜你喜欢
  • 2018-11-27
  • 2020-12-07
  • 2018-07-24
  • 1970-01-01
  • 2018-06-13
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
相关资源
最近更新 更多