当前位置: 首页 > 知识库问答 >
问题:

如何取消/取消订阅Angular 4中所有挂起的HTTP请求

方风华
2023-03-14

如何取消/中止angular 4中所有挂起的HTTP请求

有一个取消HTTP请求的unsubscribe方法,但是如何一次取消所有挂起的请求。

尤其是在改变路线的时候。

我做了一件事

ngOnDestroy() {
  this.subscription.unsubscribe();
}

但是如何在全球范围内实现这一点

有什么想法吗?

共有3个答案

冉伯寅
2023-03-14

如果你不想手动退订所有订阅,那么你可以这样做:

export function AutoUnsubscribe(constructor) {

  const original = constructor.prototype.ngOnDestroy;

  constructor.prototype.ngOnDestroy = function() {
    for (const prop in this) {
      if (prop) {
        const property = this[prop];
        if (property && (typeof property.unsubscribe === 'function')) {
          property.unsubscribe();
        }
      }
    }

    if (original && typeof original === 'function') {
      original.apply(this, arguments)
    };
  };

}

然后,您可以将其用作组件中的装饰器

@AutoUnsubscribe
export class YourComponent  {
}

但是您仍然需要将订阅存储为组件属性。当您导航出组件时,将出现自动取消订阅功能。

商麒
2023-03-14

您可以创建一个拦截器来对每个请求应用teatle运算符。然后在路由更改时,您将发出取消所有挂起请求的事件。

@Injectable()
export class HttpCancelInterceptor implements HttpInterceptor {
  constructor(private httpCancelService: HttpCancelService) { }

  intercept<T>(req: HttpRequest<T>, next: HttpHandler): Observable<HttpEvent<T>> {
    return next.handle(req).pipe(takeUntil(this.httpCancelService.onCancelPendingRequests()))
  }
}

助手服务。

@Injectable()
export class HttpCancelService {
  private cancelPendingRequests$ = new Subject<void>()

  constructor() { }

  /** Cancels all pending Http requests. */
  public cancelPendingRequests() {
    this.cancelPendingRequests$.next()
  }

  public onCancelPendingRequests() {
    return this.cancelPendingRequests$.asObservable()
  }

}

挂接应用程序中某个位置的路由更改(例如appComponent中的onInit)。

this.router.events.subscribe(event => {
  if (event instanceof ActivationEnd) {
    this.httpCancelService.cancelPendingRequests()
  }
})

最后,将拦截器注册到你的app.module.ts:

  import { HttpCancelInterceptor } from 'path/to/http-cancel.interceptor';
  import { HTTP_INTERCEPTORS } from '@angular/common/http';

  @NgModule({
    [...]
    providers: [
      {
        multi: true,
        provide: HTTP_INTERCEPTORS,
        useClass: HttpCancelInterceptor
      }
    ],
    [...]
  })
  export class AppModule { }
姜俊民
2023-03-14

从RxJS中检出 运算符以全局删除订阅:

-RxJS 6(使用管道语法)

import { takeUntil } from 'rxjs/operators';

export class YourComponent {
   protected ngUnsubscribe: Subject<void> = new Subject<void>();

   [...]

   public httpGet(): void {
      this.http.get()
          .pipe( takeUntil(this.ngUnsubscribe) )
          .subscribe( (data) => { ... });
   }

   public ngOnDestroy(): void {
       // This aborts all HTTP requests.
       this.ngUnsubscribe.next();
       // This completes the subject properlly.
       this.ngUnsubscribe.complete();
   }
}

-RxJS

import 'rxjs/add/operator/takeUntil'

export class YourComponent {
   protected ngUnsubscribe: Subject<void> = new Subject<void>();

   [...]

   public httpGet(): void {
      this.http.get()
         .takeUntil(this.ngUnsubscribe)
         .subscribe( (data) => { ... })
   }

   public ngOnDestroy(): void {
       this.ngUnsubscribe.next();
       this.ngUnsubscribe.complete();
   }
}

您基本上可以在每次想要完成一组流时使用Next()在退订主题上发出事件。当组件被销毁时,取消订阅活动的可观测对象也是一个很好的做法,以避免内存泄漏。

值得一读:

>

  • 在泄漏前避免服用

    Seangwright的一个很棒的回答

  •  类似资料:
    • 本文向大家介绍深入理解Angular4订阅(Subscribe)与取消,包括了深入理解Angular4订阅(Subscribe)与取消的使用技巧和注意事项,需要的朋友参考一下 订阅(Subscribe) 写过js的都知道,subscribe在很多地方都能看到它的身影,并且起到了很重要的作用。侦听http请求的返回,页面间传递参数… …说起订阅,就不能不提Observable,说起Observabl

    • 问题内容: 由于异步方法问题,我收到一条错误消息。在我的终端中,我看到: 我注意到这是特别指出 这是我用于该部分的代码: 我试图弄清楚如何在此异步方法中使用a 。我该怎么办? 谢谢! 问题答案: 您可以在此处使用React模式来避免内存泄漏。 在您的构造函数中: } 在你的 在你里面 基于可取消承诺模式的推荐使用 Axios的 方法。因此,您可以在卸载组件的同时取消任何网络呼叫。这是Axios取消

    • 问题内容: 在该程序包下,您有诸如和之类的类,我想可以将其描述为一些可用的示例。 这些主题如何退订?没有方法,并且调用完全结束了Observable,对吗? 问题答案: 同时是an 和an ,可以像普通可观察对象一样取消订阅。使主题特别之处在于它是可观察者和观察者之间的桥梁。它可以通过释放观测到的项目,也可以发射新的项目。就像对期货的承诺一样,主体是可观察的对象。 这是主题科的简短说明: Asyn

    • 在这篇文章之后,我正在使用带有RxJava/RxKotlin Flowable的Room。我让它运行,但在带有3个片段的ViewPager中使用它存在问题。 我将向您介绍我的代码: 我有一个带有选项卡布局和三个片段(A、B和收藏夹)的视图分页器。前两个片段包含可以添加到收藏夹的数据列表。 在最喜欢的片段中,我使用Flowable来监听A和B所做的更改并相应地更新列表。但是,当一个项目在A和B中成为

    • 问题内容: 有一个新的API用于从JavaScript发出请求:fetch()。是否有任何内置的机制可以在飞行中取消这些请求? 问题答案: 现在支持截至2017年9月20日的参数,但目前 并非所有浏览器都支持此参数 。 2020更新: 大多数主流浏览器(Edge,Firefox,Chrome,Safari,Opera和其他一些浏览器)都支持该功能,该功能已成为DOM生活标准的一部分。(截至2020

    • 我使用SockJS和StompJS,当我在浏览器中打开我的应用程序时,有时它会在连接到websocket之前尝试订阅一些主题。我希望主题订阅等待应用程序连接到websocket。 这就是我实现此代码的原因,我将其称为: 因此,我只在连接状态为时才订阅该主题,并且只有在客户端首次成功连接时才会调用该主题。 我想稍后从主题中取消订阅,所以我需要内部订阅返回的对象,我还需要内部订阅的消息。 我所实现的很