【问题标题】:HttpClient Request intercepter like, at time of getting response from serverHttpClient 请求拦截器,例如,在从服务器获取响应时
【发布时间】:2018-03-27 08:29:32
【问题描述】:

我想在请求尝试命中时打开一个加载器弹出窗口,在得到响应后,我想关闭它。 有什么方法可以使用 httpclient 从一个地方执行它。

【问题讨论】:

  • 你可以实现一个HTTP拦截器...https://angular.io/api/common/http/HttpInterceptor
  • @Guntram 我想在响应来自服务器端时使用它。在发送服务之前,我们可以使用 intercept(req: HttpRequest, next: HttpHandler)
  • 你没有提供任何代码,例如你做了什么,或者jsfiddle(或类似的),stackoverflow.com/questions/44396890/angular-4-http-interceptor

标签: angular httpclient intercept


【解决方案1】:

类似这样的:

@Injectable()
export class I1 implements HttpInterceptor {

  constructor(public service: SomeService) {
    console.log(service);
  }

  intercept(req: HttpRequest<any>, next: HttpHandler): Observable<HttpEvent<any>> {

    setTimeout(() => {
      this.service.loading = true;
    });

    return next.handle(req).do(
      (event: HttpEvent<any>) => {
        if (event instanceof HttpResponse) {
          setTimeout(() => {
            this.service.loading = false;
          });

        }
      },
      (err: any) => {

      }
    );
  }
}

SomeService.ts

@Injectable()
export class SomeService {
  _loading = false;
  constructor() {

  }

  set loading(isLoad: boolean) {
    this._loading = isLoad;
  }

  get loading() {
    return this._loading;
  }

}

并在您的Root 组件中注入此服务:

@Component({
    selector: 'my-app',
    template: `
        IsLoading: {{service.loading}}
        <div><h3>Response</h3>{{response|async|json}}</div>
        <button (click)="request()">Make request</button>`
    ,
})
export class AppComponent {
    response: Observable<any>;
    constructor(private http: HttpClient, public service: SomeService) {}

    request() {
        const url = 'https://jsonplaceholder.typicode.com/posts/1';
        this.response = this.http.get(url, {observe: 'body'});
    }
}

CODE EXAMPLE

  1. 使用 BehaviorSubject

SpinnerService:

import { Injectable } from '@angular/core';
import { BehaviorSubject } from 'rxjs/BehaviorSubject';
import { Observable } from 'rxjs/Observable';
import { share } from 'rxjs/operators';

@Injectable()
export class SpinnerService {
  private visible$ = new BehaviorSubject<boolean>(false);

  show() {
    this.visible$.next(true);
  }

  hide() {
    this.visible$.next(false);
  }

  isVisible(): Observable<boolean> {
    return this.visible$.asObservable().pipe(share());
  }
}

StackBlitz EXAMPLE

【讨论】:

  • 很好,我通过点击得到了它,终于到了。
  • @mukundpatel,更新答案:使用 spinner 和 BehaviorSubject 添加
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-21
  • 1970-01-01
相关资源
最近更新 更多