angular中订阅方法的最佳实践是啥?

Posted

技术标签:

【中文标题】angular中订阅方法的最佳实践是啥?【英文标题】:What is the best practice for subscribe method in angular?angular中订阅方法的最佳实践是什么? 【发布时间】:2022-01-01 02:42:05 【问题描述】:

我只是想知道哪个是 Angular 的最佳实践。

这是一个可观察的方法。

downloadRequest(ids: number[], url: string, inputName: string): Observable<void> 
 const formData = new FormData();
 formData.append(inputName, ids.join(','));
 return this.http.post<void>(url, formData)                                                    

这是我使用的订阅方法。

this.downloadService.downloadRequest(data.blabla, url, 'blabla').subscribe(res => 
 alert('HEY');
 , err => 
  console.log(err);
 );

在这种情况下,只有当响应状态等于 200 时,此警报才会起作用。对吗?可观察方法返回 void。所以,我无法确定响应状态。

相反,我应该使用以下情况吗?可观察方法返回任何。我可以得到响应状态。

downloadRequest(ids: number[], url: string, inputName: string): Observable<any> 
 const formData = new FormData();
 formData.append(inputName, ids.join(','));
 return this.http.post<any>(url, formData, observe: 'response')                                                    


this.downloadService.downloadRequest(data.blabla, url, 'blabla').subscribe(res =>                   
 if (res.status === 200)                                                                     
   alert('HEY');
 
 , err => 
  console.log(err);
 );

【问题讨论】:

【参考方案1】:

当您订阅由HttpClient 返回的 Observable 时,您最多可以指定 3 个回调,按顺序:

next,接收成功响应的正文(如果成功的响应没有正文,则返回 null) error,收到错误,阻止此请求成功 complete,如果请求成功则在next之后调用

如您所见,每个成功的请求都会调用next,即使响应没有正文。

所以,我无法确定响应状态。

这是一个误解。每个 HTTP 响应 contains 一个响应代码。它可能包含也可能不包含正文,但它始终包含一个响应代码,它指示请求是否成功,并确定 HttpClient 将调用next 还是error

顺便说一句,所有格式为 2xx indicate success 的响应代码,而不仅仅是 200。接收到 201 Created204 No Content 无需惊慌。

【讨论】:

这就是我要寻找的答案。我现在明白了。 next 为每个成功的请求调用。谢谢!【参考方案2】:

正常情况下的http.post方法。

只返回body或者异常的内容就够了,我们经常只想获取request的内容。这就是为什么它被用作默认行为。

有时,我们需要访问其他字段,例如状态,https,则必须使用第二种方式。

您可以自定义返回HttpResponse的数据。

来自文档:

https://angular.io/guide/http#reading-the-full-response

https://angular.io/api/common/http/HttpResponse

【讨论】:

感谢您的回答,但我不是在问这个。请问在什么情况下进入subscribe方法?有必要像我写的第二种方式发送吗?我已经用第二种方式发送了 observe: 'response' 。 正常情况下就足够了,这就是为什么它被用作默认值。在某些情况下,我们希望访问其他字段,例如响应头...我们必须使用第二种方式...我更新了答案...

以上是关于angular中订阅方法的最佳实践是啥?的主要内容,如果未能解决你的问题,请参考以下文章

在 Angular 站点中使用 content-security-policy 的最佳实践是啥?

在 .Net 中使用扩展方法的最佳实践是啥?

在 CloudKit 中获取 CKReferences 的最佳实践方法是啥?

使用视图模型中的属性值实现方法的最佳实践是啥?

临时维护页面的最佳实践方法和状态代码是啥?

Angular 2+ - 数据加载:最佳实践