【问题标题】: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);
 });

【问题讨论】:

    标签: angular typescript rxjs observable subscription


    【解决方案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' }。
    • 正常情况下就足够了,这就是为什么它被用作默认值。在某些情况下,我们希望访问其他字段,例如响应头...我们必须使用第二种方式...我更新了答案...
    猜你喜欢
    • 2020-02-04
    • 2018-04-19
    • 1970-01-01
    • 2023-04-08
    • 2015-04-08
    • 2015-11-22
    • 1970-01-01
    • 1970-01-01
    • 2019-06-29
    相关资源
    最近更新 更多