Ionic 如何使用httpClient拦截器捕获成功的请求?

pes8fvy9  于 2023-09-28  发布在  Ionic
关注(0)|答案(3)|浏览(207)

大多数httpClient拦截器教程都捕获错误响应以显示警报。
示例如下:
https://ionicacademy.com/ionic-http-interceptor/
https://medium.com/@deniscangemi/intercept-http-requests-in-angular-c6392b7b0e0
是否可以使用拦截器为每个HTTP请求提供一个加载器?
如果是,如何处理或捕获成功的HTTP请求,以解除加载器。

62lalag4

62lalag41#

你也可以在管道中添加一个tap函数,它将在每次运行时执行,如下所示:

  1. import { tap, catchError } from 'rxjs/operators';
  2. // ...
  3. return next.handle(clonedReq).pipe(
  4. tap(data => {
  5. // Do your success stuff in here
  6. }),
  7. catchError(error => {
  8. // Do your error handling in here
  9. })
  10. );
8e2ybdfx

8e2ybdfx2#

我写了一个简单的服务,它允许我在整个应用程序中启用/禁用加载器。您只需为API调用提供一个唯一的名称:

  1. import { Injectable } from "@angular/core";
  2. @Injectable({
  3. providedIn: "root"
  4. })
  5. export class WatcherService {
  6. private watchers = new Map<String, Boolean>();
  7. public isLoading(watcher: String): Boolean {
  8. return this.watchers.get(watcher) || false;
  9. }
  10. public start(watcher: String) {
  11. this.watchers.set(watcher, true);
  12. }
  13. public stop(watcher: String) {
  14. this.watchers.set(watcher, false);
  15. }
  16. }

密钥可以是例如API端点URL。您可以将监视器注入拦截器。
通过这种方式,您可以在任何地方显示加载器,而不必担心在许多组件层之间传递标志/事件,只是为了显示加载器。
例如,我的应用程序中有一个列表。我可以从许多地方(过滤器,搜索栏或用户向下滚动后)获取新的项目。我不需要将所有组件连接到我的清单来显示加载器,我只需要调用:
watcher.start('actionName')
并且清单知道,它应该显示加载器:
<qlisting [loading]="watcher.isLoading(getUnitsActionName)">

展开查看全部
nhaq1z21

nhaq1z213#

您可以使用map并验证响应中是否有任何错误。

  1. import { map } from 'rxjs/operators';
  2. import {
  3. HttpEvent,
  4. HttpHandler,
  5. HttpInterceptor,
  6. HttpRequest,
  7. HttpResponse
  8. } from '@angular/common/http';
  9. export class HttpInterceptorInterceptor implements HttpInterceptor {
  10. constructor() { }
  11. intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
  12. return next.handle(request).pipe(
  13. map((event: HttpEvent<any>) => {
  14. if (event instanceof HttpResponse) {
  15. if (event.ok) {
  16. console.log('Success');
  17. } else {
  18. console.log('Error');
  19. }
  20. }
  21. return event;
  22. })
  23. );
  24. }
  25. }

解决方案二:正在使用catchError。

  1. import { map, catchError } from 'rxjs/operators';
  2. import {
  3. HttpEvent,
  4. HttpHandler,
  5. HttpInterceptor,
  6. HttpRequest,
  7. HttpResponse
  8. } from '@angular/common/http';
  9. export class HttpInterceptorInterceptor implements HttpInterceptor {
  10. constructor() { }
  11. intercept(request: HttpRequest<unknown>, next: HttpHandler): Observable<HttpEvent<unknown>> {
  12. return next.handle(request).pipe(
  13. map((event: HttpEvent<any>) => {
  14. if (event instanceof HttpResponse) {
  15. if (event.ok) {
  16. console.log('Success');
  17. } else {
  18. console.log('Error');
  19. }
  20. }
  21. return event;
  22. }),catchError((error: HttpErrorResponse) => {
  23. let errorMsg = '';
  24. if (error.error instanceof ErrorEvent) {
  25. errorMsg = `Error: ${error.error.message}`;
  26. console.log('This is client side error');
  27. } else {
  28. errorMsg = `Error Code: ${error.status}, Message: ${error.message}`;
  29. console.log('This is server side error');
  30. }
  31. console.log(errorMsg);
  32. return throwError(() => errorMsg);
  33. })
  34. );
  35. }
  36. }
展开查看全部

相关问题