在 Angular 5 中使用 observable 的好处是什么?

3

我对在Angular 5中使用httpclient感到困惑。我是Angular的新手,只是按照官方Angular教程进行操作。我不太了解observables、promise、pipe等等。目前,我正在使用一个服务来处理所有的http方法。对于post请求,我正在使用pipe。以下是该方法。

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

在组件内部,我像这样调用了create方法..
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();
    }

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


@DeborahK 请检查这个。 - Harikrishnan
1个回答

2

我应该在组件中使用subscribe吗?

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

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

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

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

这就是为什么Angular提供文档的原因。例如,这个HttpClient指南和这个RxJS指南。请阅读它们。


谢谢。我还有一个疑问。当出现错误时,catchError会起作用,并执行handleError。但是,当我订阅并在订阅中放置另一个错误处理程序函数时,即使发生错误,该函数也永远不会被执行。每当接收到数据时,console.log("inside component data type-company"+JSON.stringify(data))都会被执行,即使出现错误。 - Harikrishnan
这是因为你在服务中的错误处理程序(大多数情况下是无用的)没有像应该那样重新抛出错误。你还没有发布它,所以... - JB Nizet
无用的意思是...我应该从服务中删除那个错误处理程序吗? - Harikrishnan
我不知道,因为你没有发布它,也没有告诉我为什么添加它。所以我不知道它是做什么的,也不知道你为什么认为它有用。 - JB Nizet
1
如果您需要一个有用的错误处理程序(例如,显示实际的通用错误消息给用户),则请使用HTTP拦截器,如文档中所述。无论如何,如果您选择继续使用这样的处理程序,则它应该返回Observable.throw(error),以将错误传播到调用者。请注意,处理程序将被调用无论错误是什么(包括,例如,无法发送请求,在这种情况下,您肯定不会有JSON响应)。 - JB Nizet
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接